2013-08-27 62 views
0

我目前正在研究一些代码,我知道它有什么问题。我的代码提示用户输入一个名称,并使用fgets() or sscanf()将其作为字符串存储。如果用户输入错误的东西(即数字或字母数字的情况),它应该打印错误消息并再次要求输入,直到用户输入权限。此外,我已经初始化:我如何解决这个while循环嵌套在if-else中?

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

你正在''s''周围缺少名字。 – Barmar

回答

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