【问题标题】:C - strcmp() not functioning correctlyC - strcmp() 无法正常工作
【发布时间】:2014-04-08 01:15:26
【问题描述】:

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

【问题讨论】:

  • 您是否尝试过只检查inChar == *currChar
  • currChar 甚至没有启动。要比较字符,只需使用 '==' 运算符。
  • 每当看到标题说某些工具无法正常工作时,99.9% 的可能性是发帖者是新手并且该工具被滥用。为什么要尝试使用字符串比较函数来比较单个字符?

标签: c string mmap strcmp


【解决方案1】:

strcmp 比较字符串。 &inChar 不是字符串。

正如您描述的任务,您可以使用

进行比较
if (inChar == *currChar)

【讨论】:

    【解决方案2】:

    strcmp 需要一个以 '\0' 结尾的字符串。 inChar 只是一个字符,堆栈上跟在它后面的是“一些未知值”。

    如果你只是要比较字符,为什么不if (inChar == *currChar)

    【讨论】:

      【解决方案3】:

      strcmp() 用于比较以零结尾的字符串。你不是在比较字符串。您正在比较两个单独字符值的值。这是Reference 声明,

      “此函数开始比较每个字符串的第一个字符。如果它们彼此相等,它将继续以下对,直到字符不同或到达终止空字符。”

      只需将您的 strcmp 函数删除到:

      if (inChar == *currChar) ...
      

      【讨论】:

        【解决方案4】:

        试试这个:

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

        【讨论】:

          猜你喜欢
          • 2013-11-05
          • 1970-01-01
          • 2010-12-29
          • 1970-01-01
          • 2011-08-31
          • 2020-08-01
          • 2013-08-26
          • 2010-11-29
          • 2015-02-04
          相关资源
          最近更新 更多