C - strcmp()无法正常运行

时间:2014-04-08 01:15:27

标签: c string mmap strcmp

我正在尝试编写一个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

4 个答案:

答案 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);
}