【问题标题】:How can I fix this while loop nested in if-else?如何修复嵌套在 if-else 中的这个 while 循环?
【发布时间】:2013-08-27 04:26:31
【问题描述】:

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

谁能告诉我怎么了?

【问题讨论】:

  • 您在 %s 周围缺少引号。

标签: c fgets do-while scanf


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2017-02-06
    • 2023-03-22
    • 2015-12-28
    • 2020-06-22
    • 1970-01-01
    • 2012-03-12
    相关资源
    最近更新 更多