fgets(input,sizeof(input),stdin);
if (strcmp(input, "quit") == 0){
exit(-1);
}
如果我输入 quit,它不会退出程序;我想知道为什么会这样。
顺便input
声明为char *input;
.
该函数fgets
可能会在读取的字符串末尾添加一个换行符。您必须检查:
size_t ln = strlen(input) - 1;
if (input[ln] == '\n')
input[ln] = '\0';
甚至
strtok(input, "\n");
输入中的尾随换行符。请参阅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);
建议您将其编码为:
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';
}