【问题标题】:strcmp() returns 10 when I compare the exact same string in C [duplicate]当我比较 C 中完全相同的字符串时,strcmp() 返回 10 [重复]
【发布时间】:2018-08-30 20:14:08
【问题描述】:

我正在构建一个基本的 shell 程序,并使用 while 循环不断提示用户,他们可以输入命令来运行。当用户输入“退出”时,我希望我的 shell 程序终止。我使用 fgets 获取用户输入,并使用 strtok 将其解析为数组 cmdArr

int j = 0;
char **cmdArr;
char inputsp[128];
char *cmds;

printf("==>");
fgets(inputs, 128, stdin);
cmds = strtok(inputs, " ");
while (j<1) {

    i = 0;
    while (cmds != NULL) {
        cmdArr[i] = cmds;
        cmds = strtok(NULL, " ");
        i++;
    }

    if (strcmp(cmdArr[0], "exit") == 0) {
        printf("exit command passed\n");
        exit(0);
    }
    else {
        printf("==>");
        fgets(inputs, 128, stdin);
        cmds = strtok(inputs, " ");
   }
}

当我输入 exit 时,我已经确认 cmdArr[0] 通过printfing cmdArr[0] 存储字符串“exit”。当我打印出 strcmp(cmdArr[0], "exit") 的值时,我总是得到 10 的值,我也不完全确定为什么。我相信它们是相同的两个字符串,所以 strcmp 应该返回 0 正确吗?

【问题讨论】:

  • 10 是换行符的 ASCII 码,因此您的一个字符串末尾有一个换行符,而另一个则没有。

标签: c string equality strcmp


【解决方案1】:

fgets 不会从它读取的字符串中删除换行符,即使它是从 stdin 读取的。 strcmp 的返回值是字符串在第一个不同处的差异,即换行符,ASCII 值为10

【讨论】:

  • 这是strcmp 的常见实现,但标准没有指定它,依赖它是不明智的。您可以依靠返回值的符号:如果为零,则字符串相等,如果为负,则第一个字符串按字典顺序排在第一位,如果为正,则第二个字符串排在第一位。
  • @rici 我在描述 OP 系统上显示的行为 - 但你是对的。
猜你喜欢
  • 2016-01-10
  • 2011-12-25
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多