fgets()包括最后的换行符

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

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

顺便说一句, input被声明为char *input;

在您的输入中追踪换行符。 见男人fgets 。 测试“退出”+换行,例如:

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

我完全错过了最后一句,re 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); 

函数fgets可能会在字符串读取结束时添加换行符。 你必须检查:

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

甚至

 strtok(input, "\n"); 

建议你将其编码为:

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

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

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

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

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

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