【问题标题】:C strcmp() returns positive when comparing String with char pointer [duplicate]将字符串与 char 指针进行比较时,C strcmp() 返回正数 [重复]
【发布时间】:2016-10-20 06:53:02
【问题描述】:

我在 C 中有以下代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

    char *buf;

    buf = malloc(sizeof(char) * 512);


    while(strcmp(buf, "Exit!") != 0 )
    {
        printf("Enter something:");
        fgets(buf, sizeof(char) * 512, stdin);
        printf("You entered %s\n", buf);

        printf("%d\n", strcmp(buf, "Exit!"));

    }

}

我想要的行为是让while 循环在用户输入指定的string 时终止。据我了解,我可以使用char 指针在C 中表示string。我使用fgets() 存储用户输入并使用strcmp() 函数进行比较。我添加了一个调试语句,它打印出这个比较的结果,当我输入“退出!”时它返回一个正整数。这应该终止while循环。

有人可以解释我缺少什么吗?我相信这与换行符或 C 字符串终止符 \0 有关。当用户输入“退出”时,如何让 while 循环终止?

【问题讨论】:

  • fgets 读取并包含其读取的每一行的结尾'\n'
  • 如果fgets 返回NULL,您还应该break 循环。如果没有该检查,如果用户按下生成EOF 的组合键,代码将进入无限循环。该组合键在 unix 系统上是 control-D,在 windows 上是 control-Z。
  • 另外,在malloc之后,你应该有buf[0] = '\0';这行,这避免了malloc返回的缓冲区包含字符串"Exit!"的(极不可能的)机会

标签: c string while-loop strcmp


【解决方案1】:

这是因为fgets保留了从键盘输入的newline,或者在文本文件中标记了行尾。

删除它的一种简单方法是这样的:

#include <string.h>

//...

buf [ strcspn(buf, "\r\n") ] = 0;   // remove trailing newline etc

【讨论】:

  • 这肯定是个坏主意,因为如果模式不在字符串中,你可能会将 buf 溢出一个字节?
  • @SectoKia 它是完全安全的。如果\n\r 都不存在,则覆盖现有的'\0' 终止符,否则覆盖第一个匹配项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
相关资源
最近更新 更多