我正在研究一些代码,我知道它有问题。我的代码提示用户输入名称,并使用fgets () or sscanf ()
将其存储为字符串。如果用户输入错误(即数字或字母数字的情况),它应该打印错误消息并再次请求输入,直到用户输入输入权限。我也初步确定了:
char name [47];
printf ( "Name: " );
//some code dealing with newline character with the use of fgets
if ( (sscanf (name, %s, name)) == 1 )
//some code dealing with this condition
else {
do {
printf ( "ERROR: Invalid name. Name should consist of letters only.\n" );
printf ( "Name: " );
if (fgets ( name, sizeof (name), stdin ) == '\0' )
//some code dealing with EOF
} while ((sscanf (name, %s, name)) != 1);
}
谁能告诉我什么是错的?
答案 0 :(得分:1)
char name[47];
char line[4096];
while (printf("Name: ") > 0 && fgets(line, sizeof(line), stdin) != 0)
{
if (sscanf(line, "%46s", name) != 1)
...empty line?...
else if (valid_name(name))
break;
printf("Error: invalid name (%s). Name should consist of letters only.\n", name);
}
你忘了printf()
返回它打印的字符数?好吧,大多数人并不经常测试其结果,但在这种情况下这样做很有用。测试可能是!= 6
,而不仅仅是> 0
,但在实践中,这两项测试都可能正常。
请注意使用"%46s"
将值读入name
而不存在缓冲区溢出的风险。另请注意,sscanf()
不会将换行符读入name
。