【问题标题】:Why is strcmp not returning 0 [duplicate]为什么strcmp不返回0 [重复]
【发布时间】:2018-10-04 17:21:48
【问题描述】:

在我的程序的这个迷你版本中,我要求用户输入。当输入为“退出”或“退出”时,我希望程序退出 while 循环。 strcmp 函数似乎没有像我预期的那样工作。我花了一些时间寻找答案,但找不到问题。有什么想法吗?

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

#define BUFFER_SIZE 100
int main() {
    char request[BUFFER_SIZE];
    while(strcmp(request, "quit") != 0 && strcmp(request, exit) != 0) {
        fgets(request, BUFFER_SIZE, stdin);
    }
    return 0;
}

【问题讨论】:

  • 有一个尾随\n。第一个循环也包含 UB。
  • 请注意,strcmp(request, exit)exit() 函数的函数指针与request 进行比较——这不好。您的意思可能是strcmp(request, "exit")。注意编译器警告——并在提出关于 SO 的问题之前修复它们。或者如果您不理解警告,请询问。

标签: c strcmp


【解决方案1】:

fgets 读取尾随的\n 并将其存储在缓冲区中,因此您始终将quitquit\n 进行比较。

同样在while 循环第一次检查其条件时,可能会发生非常糟糕的事情,因为您的request 数组未初始化。

【讨论】:

    【解决方案2】:

    fgets 读取输入时,它还会读取输入末尾的换行符如果有足够的空间来存储它。这意味着如果您输入“quit”,那么请求实际上将包含“quit\n”。

    此外,第一次循环时,request 不包含任何内容,因此您正在读取未初始化的值。

    在这种情况下,最简单的做法是在要检查的字符串中添加换行符,并将 while 循环更改为 do..while 循环,以便在最后执行检查:

    do {
        fgets(request, BUFFER_SIZE, stdin);
    } while(strcmp(request, "quit\n") != 0 && strcmp(request, "exit\n") != 0);
    

    另请注意,您在第二次调用中传递了函数 exit,而不是字符串 "exit"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      相关资源
      最近更新 更多