13
fgets(input,sizeof(input),stdin);
if (strcmp(input, "quit") == 0){
  exit(-1);
}

如果我输入 quit,它不会退出程序;我想知道为什么会这样。

顺便input声明为char *input;.

4

5 回答 5

13

该函数fgets可能会在读取的字符串末尾添加一个换行符。您必须检查:

size_t ln = strlen(input) - 1;
if (input[ln] == '\n')
    input[ln] = '\0';

甚至

strtok(input, "\n");
于 2012-11-18T19:37:08.213 回答
8

输入中的尾随换行符。请参阅man fgets。测试“退出”+换行符,例如:

fgets(input,sizeof(input),stdin);
if(strcmp(input, "quit\n") == 0){
    exit(-1);
}

我完全错过了最后一句话,重新char *input。根据架构,input长度为 4 或 8 个字节。所以代码是有效的

fgets(input, 8, stdin);

这并不反映内存的实际大小,input指向。只要输入短于八个字节,这可能“有效”,但如果输入更大,则会截断输入。此外,您将在下次调用时获得其余的输入fgets

您应该给出实际大小或接受@JonathanLeffler 的建议并声明一个 char 数组,例如

char input[64];
fgets(input, sizeof(input), stdin);

或者

char *input = malloc(N);
fgets(input, N, stdin);
于 2012-11-18T19:38:09.573 回答
0

建议您将其编码为:

if(strstr(input, "quit") != NULL){

原因:这将解决人们添加额外字符的问题(例如文本之前或之后的空格)。

于 2017-05-31T13:33:31.543 回答
-1

此解决方案只需要标准库 (stdio.h) 并给出相同的结果。

for (i = 0; input[i] != '\0'; i++); /* getting the string size */
input[i-1] = '\0'; /* removing the newline */
于 2015-05-24T20:31:45.087 回答
-2

我所做的是将换行符替换为 '\0' null 。

while(fgets(message,80,stdin))
{
    l=strlen(message)-1;
    if(message[l]='\n') message[l]='\0';
            else message[i+1]='\0';
}
于 2013-07-29T15:07:22.987 回答