C - Strcmp() 不工作

C - Strcmp() not working

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

int main()
{

const int SIZE = 100;

char input[SIZE];

while(1)
{
    fgets (input, SIZE - 2, stdin);          // input
    printf("%d", strcmp(input, "exit"));    //returining 10 instead of 0

    if(strcmp(input, "exit") == 0)
    {
        printf("SHELL Terminated\n");
        exit(0);    
    }

return 0;
}

我遇到了问题。如果我在 input 变量中输入 exit,函数 strcmp() returns 10,但它应该 return 0 并退出程序,因为 exit 等于 exit。但事实并非如此。

我找不到问题。

你得到 10 因为你的输入字符串中有一个换行符。 10 return 值是该换行符的 ascii 值与您要比较的 "exit" 字符串文字的终止空字符之间的差异。

fgets 将换行符 (\n) 附加到读入缓冲区的字符串末尾。

使用

删除它
char* newline = strchr(input, '\n');
if (newline)
    *newline = '[=10=]';

, 某些 fgets 的调用可能不会在缓冲区中设置换行符,因此我们需要检查是否 strchr returns NULL (未找到换行符)。

函数 fgets 还包括换行符 '\n',如果数组中有足够的 space,则对应于例如按下的 Enter 键。

您应该通过以下方式删除它

fgets( input, SIZE, stdin );
input[strcspn( input, "\n" )] = '[=10=]';

或更安全

if ( fgets( input, SIZE, stdin ) != NULL ) input[strcspn( input, "\n" )] = '[=11=]';

考虑到这段代码

*strchr(input, '\n') = '[=12=]';

通常是无效的,因为换行符可以在数组中不存在,函数 strchr 将 return NULL.

fgets() 保留 '\n'。您可以将其从 input 中删除(参见其他答案)或将其添加到文字

strcmp(input, "exit\n")