[英]Unexpected fgets behavior on EOF
我有这段代码从stdin中获得一行:
char string[USR_SIZE+1];
/*USR_SIZE is 9 */
fgets(string, USR_SIZE, stdin);
size_t len = strlen(string);
if (string[len-1] == '\n') {
// read in whole line, no need to clear buffer
string[len-1] = 0;
}
else {
if(feof(stdin)){
printf("EXACT LEN\n");
}
else{
//username too long, clear stdin and retry
printf("Dumping...");
dump_line(stdin); //clear stdin
/*something that loops until success*/
}
}
缓冲区string
没有换行符表示EOF
或该字符串已被剪切。
现在。 所需的最佳字符串类似于"user_123"
(8个字符)。 现在,如果我键入"user_12345678"
它将正确地仅存储"user_123"
并执行else正文。 如果我输入"user_123"
它也会执行其他主体。
我想将"user_123"
( EOF
)字符串与"user_1234"
( "user_1234"
)区别开来,因为仅在这最后一种情况下输入不正确。 为什么没有设置feof
?
此外:如何检查fgets
返回值以进行错误管理?
找到了这个解决方案:
if (fgets(string, USR_SIZE + 1, stdin)){
if (strlen(string) == USR_SIZE && string[USR_SIZE - 1] == '\n'){
printf("EXACT\n");
/* User entered an eight character string. */
string[USR_SIZE - 1] = 0;
}
else{
if(strlen(string) < USR_SIZE-1){
printf("INVALID<<<\n");
/*don't dump*/
}
else{
printf("INVALID>>>\n");
dump_line(stdin);
}
}
printf("EXIT\n");
printf("%s\n", string);
}
else{
free(auth_data);
EXIT_ON_ERROR_("Error while getting user input\n");
}
如果您想允许8个字符和EOF以及换行符,则可以使用类似的方法:
char buf[10];
fgets(buf, 10, stdin);
int len=strlen(buf);
if (buf[len-1] == '\n') buf[len-1] = '\0';
if (strlen(buf) == 8)
puts("Correct length");
else
puts("Incorrect length");
(在此示例中,未测试fgets
是否成功)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.