与fgets()包括在端部的换行[复制](fgets() includes the newline

2019-06-21 05:20发布

This question already has an answer here:

  • Removing trailing newline character from fgets() input 12 answers
fgets(input,sizeof(input),stdin);
if (strcmp(input, "quit") == 0){
  exit(-1);
}

If I type quit, it does not exit the program; I'm wondering why this is the case.

By the way input is declared as char *input;.

Answer 1:

在您输入换行符。 见男子与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 input[64];
fgets(input, sizeof(input), stdin);

要么

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


Answer 2:

该功能fgets可能在读取字符串的末尾添加一个新行。 你必须检查:

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

甚至

strtok(input, "\n");


Answer 3:

建议你这样的代码为:

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

原因:这会解决的人增加额外的字符问题(如空间文本之前或之后)。



Answer 4:

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

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


Answer 5:

我所做的是通过“\ 0” NULL替换换行符。

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


文章来源: fgets() includes the newline at the end [duplicate]
标签: c string fgets