初学者提问: 想象一下这种情况:我请求用户输入一个整数(通过使用scanf获取它),但是用户输入一个字符,因为程序到达它的结束...但我想克服它,并让程序告诉他他提供了无效输入并给用户另一个输入输入的机会,我该怎么做?
答案 0 :(得分:2)
使用fgets()
,然后sscanf()
或strtol()
。
int number;
char ch;
char *Prompt2 = "":
do {
printf("%sEnter number :", Prompt2);
Prompt2 = "Invalid input\n"; // Change Prompt2
buffer char[50];
if (fgets(buffer, sizeof buffer, stdin) == NULL) {
Handle_EOF();
}
} while (sscanf(buffer, "%d %c", &number, &ch) != 1);
使用strtol()
代替sscanf()
会增加+/-溢出保护,因为它会设置errno
。
char *endptr;
errno = 0;
long number = strtol(buffer, &endptr, 10);
if (errno || buffer == endptr || *endptr != '\n') Handle_Error(();
请参阅Read_long()作为如何使用此功能的示例。
答案 1 :(得分:1)
初学者用stdio.h中,这是家庭作业非常好,工作只要你不要指望任何幻想,比如密码字段输入,输入编辑功能,在打字时,功能键和控制键的处理格式等错误输入可以做什么仅限于基础知识。
如果你需要在C中编写一个专业的应用程序,这是我们过去在70年代和80年代所做的事情,在C中,你必须避免使用stdio.h,因此需要扫描输入。您必须检查您的操作环境和社区必须提供的内容。 Curses或ncurses可能会帮助您。在MS-DOS中,我们用来捕获中断,以便对键盘进行绝对控制。在Unix中,我们使用了Bill Joy的termcap或terminfo库,这将允许您控制终端和键盘。作为一个例子,vi编辑器基于termcap和cufo on terminfo。
请记住,创建一个清晰的基于文本的用户界面并不是一项微不足道的任务,也不容易完全控制用户的输入。幸运的是,它也不再是问题,因为Java和Swing已经存在......
答案 2 :(得分:0)
scanf
的返回值是成功扫描的参数数量。
答案 3 :(得分:0)
基本技术是检测问题(来自*scanf()
的意外返回值),然后读取行的其余部分(狼吞虎咽字符到换行符或EOF),然后恢复。
或者,通常更好(尤其是因为错误报告可以报告整行),是使用fgets()
或getline()
来读取整行,然后使用sscanf()
或其他解析该行的技术,并从那里开始。
答案 4 :(得分:0)
怎么样:
int n;
int c;
printf("Please enter an integer: ");
while (scanf("%d", &n) != 1) {
while (!isspace(c = getchar()));
ungetc(c, stdin);
printf("You must enter a valid number. Try again.\n");
continue;
}
答案 5 :(得分:0)
您可以将用户的输入作为字符串读取,然后使用strtol()
使其成为整数。
int main(void)
{
char* end;
char number_temp[256];
int number;
while(1)
{
puts("Give a number");
scanf("%s",number_temp);
number = strtol(number_temp, &end, 10);
if (end) //If there is an error the value of *end will be non zero
printf("try again");
else
break;
}
return 0;
}