我正在尝试编写一个C程序来计算短语中某些字母的频率。程序逐字符地读取短语(通过存储数组中字符的mmap
)并将当前字母与所需字母进行比较。如果匹配,则计数器递增。但是,在运行我的代码时,我得到了奇怪的结果。频率没有递增,因为字母在调用strcmp
时不匹配,即使它们在调试中匹配。我的程序中发生了什么导致这种行为?
char* data; /* input contents from mmap */
char* currChar; /* character being compared to */
char inChar; /* character being read */
...
do {
/* get character */
inChar = 0;
inChar = data[i];
/* debug */
printf("data[i] = %c, inChar = %c, &inChar = %c, currChar = %s\n",
data[i], inChar, &inChar, currChar);
/* if match */
if (strcmp(&inChar, currChar) == 0) {
/* increment frequency */
freq++;
}
/* increment position */
i++;
} while (inChar != 0);
下面是尝试计算单词“and”中“a”的频率时的示例输出。
data[j] = a, inChar = a, &inChar = S, currChar = a
data[j] = n, inChar = n, &inChar = S, currChar = a
data[j] = d, inChar = d, &inChar = S, currChar = a
0 instances of a
答案 0 :(得分:2)
strcmp
比较字符串。 &inChar
不是字符串。
正如您所描述的任务,您可以与
进行比较if (inChar == *currChar)
答案 1 :(得分:1)
strcmp
期望一个'\ 0'终止的字符串。 inChar
只是一个字符,在堆栈后面有一些“未知值”。
如果您只想比较字符,为什么不if (inChar == *currChar)
答案 2 :(得分:1)
strcmp()用于比较以零结尾的字符串。你不是在比较字符串。您正在比较两个单独字符值的值。这是Reference陈述,
“此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同或直到达到终止空字符。”
将strcmp函数移除到:
if (inChar == *currChar) ...
答案 3 :(得分:1)
试试这个:
for(j=0;currChar[j]!='\0;j++)
{
for(i=0;data[i]!='\0';++i)
{
if(currChar[j]==data[i])
++freq;
}
printf("Frequency of %c = %d", currChar[j], freq);
}