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