fgets()包括最后的换行符

时间:2012-11-18 19:35:43

标签: c string fgets

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

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

顺便说明input被声明为char *input;

5 个答案:

答案 0 :(得分:13)

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

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

甚至

strtok(input, "\n");

答案 1 :(得分: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指向。只要输入短于8个字节,这可能“有效”,但如果输入较大,则会截断输入。此外,下次拨打fgets时,您将获得剩余的输入。

你应该给出实际大小或者采用@ JonathanLeffler的建议并声明一个char数组,例如。

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

char *input = malloc(N);
fgets(input, N, stdin);

答案 2 :(得分:0)

建议您将其编码为:

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

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

答案 3 :(得分:-1)

This solution only needs the standard library (stdio.h) and gives the same results.

for (i = 0; input[i] != '\0'; i++); /* getting the string size */
input[i-1] = '\0'; /* removing the newline */

答案 4 :(得分:-2)

我所做的是用“\ 0”null替换换行符。

while(fgets(message,80,stdin))
{
    l=strlen(message)-1;
    if(message[l]='\n') message[l]='\0';
            else message[i+1]='\0';
}