【问题标题】:strcmp not workingstrcmp 不工作
【发布时间】:2010-11-01 08:25:07
【问题描述】:

我知道这可能是一个全新的问题(我已经很久没有接触过 C 语言了),但是有人能告诉我为什么这不起作用吗?

printf("Enter command: ");
bzero(buffer,256);
fgets(buffer,255,stdin);

if (strcmp(buffer, "exit") == 0)
    return 0;

如果我输入“exit”不进入if,是不是和“buffer”的长度有关?

有什么建议吗?

【问题讨论】:

    标签: c strcmp


    【解决方案1】:

    fgets() 返回字符串 "exit\n" -- 与 gets() 不同,它保留换行符。

    【讨论】:

    • ... 而“gets”只接受一个参数(本例中为缓冲区)。谢谢!
    • (请不要在公共场合使用gets()。)
    • @Jian,因为 gets() 不能保护您免受缓冲区溢出。
    【解决方案2】:

    你想这样做:

    strcmp(buffer, "exit\n")

    也就是说,当您输入字符串并按“回车”时,换行符将成为buffer 的一部分。

    或者,使用strncmp(),它只比较字符串的n个字符

    【讨论】:

    • 这很好,除非用户在退出之前或之后键入空格。并且不要忘记添加厄瓜多尔时系统停止工作的(可能是杜撰的)故事 - 人们不得不输入 Quito 作为首都的名称,程序退出(退出),因为只有前 4 个字母与'放弃'。好恶心!
    • @Jonathan 真相!我自己的建议是确保永远不允许用户在您的程序中输入任何内容。
    【解决方案3】:

    同意戴夫。您也可能希望使用 strncmp() 代替。然后您可以设置比较的长度。

    http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

    http://www.cplusplus.com/reference/clibrary/cstring/strncmp/

    【讨论】:

      【解决方案4】:

      正如其他人所说,与"exit" 比较失败,因为fgets() 在缓冲区中包含换行符。它的保证之一是缓冲区将以换行符结尾,除非输入的行对于缓冲区来说太长,在这种情况下它不会以换行符结尾。 fgets() 还保证缓冲区是 nul 终止的,因此您不需要将 256 字节归零,而只需让 fgets() 使用 255 即可获得该保证。

      与精确比较 "exit\n" 的简单答案要求用户没有在单词之前或之后意外添加空格。如果您想强制用户小心使用 exit 命令,这可能无关紧要,但通常可能会导致用户烦恼。

      使用strncmp() 可能允许"exited""exit42" 等匹配您可能不想要的位置。这可能对您不利,特别是如果某些有效命令是其他有效命令的前缀字符串。

      在一般情况下,将 I/O、标记化、解析和操作分成各自的阶段通常是个好主意。

      【讨论】:

      • 使用:fgets(buffer, sizeof(buffer), fp);并且不要减去一个(或使用 255),因为 fgets() 行为正常 - 你告诉它有多少空间,它确保它不再使用,将空终止符放在数组中的最后一个可用字符中。跨度>
      • 正是我想说的……但说得更好。 ;-)
      【解决方案5】:

      我建议你从字符串的末尾去掉 \n,像这样。

      字符缓冲区[256]; 国际化; /* 获取字符串,确保为空字节留出空间 */ 如果 ( fgets(buf,sizeof(buf) - 1) == EOF ) { printf("错误\n"); 退出(1); } /* 绝对总是空终止,最简单的方法 */ buf[sizeof(buf) - 1] = '\0'; /* 计算长度,如果有则截断 \n */ len = strlen(buf); 而 ( len > 0 && buf[len - 1] == '\n' ) { buf[len - 1] = '\0'; --len; }

      这样,如果您必须将输入的字符串与多个常量进行比较,则不必将 \n 添加到所有常量中。

      【讨论】:

      • 为什么投反对票?这是一个有效的解决方案,虽然没有解释。
      猜你喜欢
      • 2016-06-23
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      相关资源
      最近更新 更多