fgets(input,sizeof(input),stdin);
if (strcmp(input, "quit") == 0){
exit(-1);
}
如果我输入 quit,程序并没有退出;我想知道这是为什么。
顺便提一下,input
被声明为 char *input;
。
fgets
函数可能会在读取字符串的末尾添加一个换行符。 您需要检查它:
函数fgets
有时会在读取完一行后自动加上一个换行符(\n),如果你不想要这个换行符,你需要手动去掉。
size_t ln = strlen(input) - 1;
if (input[ln] == '\n')
input[ln] = '\0';
甚至更多
strtok(input, "\n");
fgets()
不会添加换行符;它将包括标记行末的换行符。这样,您就可以知道是否已读取整行。 - Jonathan Lefflerln
的值就会变成 SIZE_MAX
,从而导致 input[ln]
的越界读取 --> UB。为避免这种漏洞,可以检测 ln
或使用 ln[strcspn(ln,"\n")] = 0;
。如果第一个字符是 '\n'
,strtok(input, "\n");
就无法去掉该字符。 - chux - Reinstate Monicafgets(input,sizeof(input),stdin);
if(strcmp(input, "quit\n") == 0){
exit(-1);
}
我完全错过了最后一句话,关于 char *input
。根据架构不同,input
的长度将为4或8个字节。因此,代码实际上是这样的:
fgets(input, 8, stdin);
input
指向的真实大小。只要输入长度小于8字节,这可能会“正常工作”,但如果输入更大,则会截断输入。此外,下次调用fgets
时,您将获得其余输入。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 */
while(fgets(message,80,stdin))
{
l=strlen(message)-1;
if(message[l]='\n') message[l]='\0';
else message[i+1]='\0';
}
strlen(message)>80
或使用EOF作为终止符时,可能会出现两种情况,换行符不会被添加。 - artdanil
char *input;
而没有为其分配指向空间,那么您很幸运(或者我应该说不幸?)没有出现崩溃。您必须确保有足够的空间:char input[64];
更好;除非有令人信服的理由使用更短的长度,否则我通常使用4096作为行长。此外,您应该检查fgets()
是否读取了一些数据:if (fgets(input, sizeof(input), stdin) != 0) ... OK - read some data...
。 - Jonathan Leffler