C 将结构值与变量值进行比较

C 将结构值与变量值进行比较,c,struct,C,Struct,我正在努力比较结构和变量的内容。array1中有10个结构,其中包含变量value和count。我需要遍历每个值变量,直到找到一个匹配的tempVal,然后增加相应的计数,然后搜索就可以结束了。如果没有找到,函数将返回-1 我有以下代码,运行良好,但不工作,我有一种感觉,它可能是与strcmp线的错误,但我不确定。为任何意见干杯 int valCheck(char *tempVal){ int j; for(j=0;j<10;j++){ if(strcmp

我正在努力比较结构和变量的内容。array1中有10个结构,其中包含变量value和count。我需要遍历每个值变量,直到找到一个匹配的tempVal,然后增加相应的计数,然后搜索就可以结束了。如果没有找到,函数将返回-1

我有以下代码,运行良好,但不工作,我有一种感觉,它可能是与strcmp线的错误,但我不确定。为任何意见干杯

int valCheck(char *tempVal){

    int j;
    for(j=0;j<10;j++){
        if(strcmp(array1[j].value, tempVal) == 0){ 
            array1[j].count++; //increment its count
            break;

        }
    }
}
int-valCheck(char*tempVal){
int j;

对于(j=0;j假设如下:

  • 您的数组已正确分配(在堆栈上或动态分配)为至少10个元素宽
  • 您的结构成员
    value
    是有效的
    char*
    或固定长度的
    char[n]
    缓冲区
  • 结构的
    成员引用的字符串数据正确地以null结尾
  • tempVal
    引用的字符串数据有效且正确以null结尾
  • 您知道,
    strcmp()
    比较区分大小写
  • 您对数组中的100个元素进行了注释,此代码仅检查前10个元素是有意的
我的水晶球告诉我,最终你需要让你的函数返回一些东西

int valCheck(char *tempVal)
{
    int j;
    for(j=0;j<10;j++)
    {
        if(strcmp(array1[j].value, tempVal) == 0)
        { 
            array1[j].count++; //increment its count
            return j; // <== return index of found element
        }
    }
    return -1;  // <== return -1 per your description of failure.
}
输出

hello my name is dave hello I am dave hi
WORD 0: hello, COUNT IS: 2
WORD 1: my, COUNT IS: 1
WORD 2: name, COUNT IS: 1
WORD 3: is, COUNT IS: 1
WORD 4: dave, COUNT IS: 2
WORD 5: I, COUNT IS: 1
WORD 6: am, COUNT IS: 1
WORD 7: hi, COUNT IS: 1

家庭作业

在所有这些之后,我让您来确定为什么下面的代码也可以工作,但是没有使用临时缓冲区来完成这项工作(无论如何,有点)

#包括
#包括
#包括
#包括
式返回结构值
{
字符值[64];
整数计数;
};
//全局数组。
#定义最多256个字
结构值数组1[MAX_WORDS]={{{0},0};
int n_words=0;
//检查数组中是否存在值
int valCheck(const char*tempVal)
{
int j;
对于(j=0;j对于(i=0;i请定义不起作用。还要将
array1[]
结构的定义添加到问题中。从您的代码中,没有人能看出有什么问题。array1是什么?什么是tempVal添加
fprintf(stderr,“%d{%s,%s}\n”,j,array1[j]。value,tempVal)
循环内部可能会给您一些启示。函数
strcmp
适用于C字符串,而不是
struct
s。当它找到“空终止符”时,它停止运行,它可能是嵌入在
结构中的任意零。
@dasblinkenlight我假设如果将结构指针作为参数传递给
strcmp()
我看不到任何类型转换,并且我确实看到一个结构成员表示(
数组1[j]中的
)。知道这在运行时是编译还是失败可能会缩小范围。嗯,当时我的比较代码似乎没有太大的错误,所以我肯定在其他地方遇到了问题。我非常确定所有这些假设都得到了满足,除了:-结构的值成员对字符串数据的引用是正确的null terminated.-tempVal引用的字符串数据有效且正确以null结尾。如果helps@user2209254更新后的帖子将始终返回-1。
return j
的存在有一个原因:表示成功(即非-1)返回值。您也可以轻松返回0。只要不是(-1),任何事情都可以如果找到匹配项。啊,抱歉,忘记了!我确实尝试返回0,但它只执行一次循环并停止。该文件只包含由空格分隔的随机单词。“你好,我的名字是dave你好,我是dave你好”-非常随机!@user2209254好的。前提是你正在阅读这些字符串,在100字字典中查找它们,如果它们已经存在,则增加一个引用计数,否则添加它。如果听起来正确,你可能比你想象的更接近。将下一个单词扫描到本地变量中,然后使用valCheck()以确定它是否存在。如果不存在,则返回(-1),然后添加它。您需要跟踪字典中有多少单词用作要进行的比较的顶端,并在添加单词时增加。但检查程序中唯一的错误是没有ret val。我尝试过将tempVal分配给文件中的下一个单词,而不是使用“fscanf(input,“%s”,tempVal)”使用静态值然后在“if(checkedVal==-1){”块中,使用“array1[i].value=tempVal”分配单词,但也没有成功
hello my name is dave hello I am dave hi
WORD 0: hello, COUNT IS: 2
WORD 1: my, COUNT IS: 1
WORD 2: name, COUNT IS: 1
WORD 3: is, COUNT IS: 1
WORD 4: dave, COUNT IS: 2
WORD 5: I, COUNT IS: 1
WORD 6: am, COUNT IS: 1
WORD 7: hi, COUNT IS: 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

struct values
{
    char value[64];
    int count;
};

// global array.
#define MAX_WORDS   256
struct values array1[MAX_WORDS] = {{{0},0}};
int n_words = 0;

//check if value exists in array
int valCheck(const char *tempVal)
{
    int j;
    for(j=0; j< n_words; j++)
    {
        if(strcmp(array1[j].value, tempVal) == 0)
        {
            array1[j].count++; //increment its count
            return j;
        }
    }
    return -1;
}

int main(int argc, char *argv[])
{
    FILE * input = NULL;
    int i=0;

    if (argc < 2)
    {
        printf("Must specify a filename.\n");
        return EXIT_FAILURE;
    }

    // open file
    input = fopen(argv[1],"r");
    if (!input)
    {
        perror("Failed to open file.");
        return EXIT_FAILURE;
    }

    // read all strings from the file one at a time.
    while (n_words < MAX_WORDS &&
           fscanf(input, "%64s", array1[n_words].value) == 1)
    {
        if (valCheck(array1[n_words].value) == -1)
        {
            array1[n_words].count = 1;
            ++n_words;
        }
    }
    fclose(input);

    // summary report
    for (i=0;i<n_words;++i)
        printf("WORD %i: %s, COUNT IS: %i\n", i, array1[i].value, array1[i].count);

    return 0;
}