如何在嵌套在if-else中的循环中修复此问题?

时间:2013-08-27 04:26:32

标签: c fgets do-while scanf

我正在研究一些代码,我知道它有问题。我的代码提示用户输入名称,并使用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);
}

谁能告诉我什么是错的?

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