我正在用C编写程序,假设要求用户输入一个数字。
数字必须大于零,并且在数字之前或之后不能包含字母。 (即:400
有效但abc
或400abc
或abc400
不是有效的。我可以使我的程序使除400abc
之外的所有内容无效。如果输入开始有效然后变为无效,我将如何使输入无效? (我大约2个月进入c级介绍所以我的知识非常有限。)
#include<stdio.h>
int check(void);
void clear_input(void);
main()
{
int num;
printf("Please enter a number: ");
num = check();
printf("In Main %d\n", num);
}
int check(void){
int c;
scanf("%d", &c);
while (c < 0){
clear_input();
printf("Invalid, please enter an integer: ");
scanf("%d", &c);
}
return c;
}
void clear_input(void){
char junk;
do{
scanf("%c", &junk);
}while (junk != '\n');
}
答案 0 :(得分:6)
您还可以检查从用户输入扫描的每个字符的ascii值是否应该在48-57范围内,它只是整数值。
答案 1 :(得分:1)
strtol
可以用来做,但需要额外的工作。
运行此代码后:
char *endptr;
int n = strtol(num_text, &endptr, 10);
n
将包含该号码。但你还是要检查一下:
1. *endptr=='\0'
- 这意味着strtol
并没有停在中间。在400abc
中,endptr
将指向abc
。您可能希望允许尾随空格(在这种情况下,请检查endptr
是否指向全空格字符串。
2. num_text
不是空的。在这种情况下,strtol
将返回0,但空字符串不是有效数字。
答案 2 :(得分:0)
使用fgets
将输入作为一行阅读。
检查所有字符是否都是数字。
如果没有,则无效。如果是,请使用sscanf
将行放入int。
检查int是否在范围内;你已经完成了。
答案 3 :(得分:0)
带有%d的Scanf会将“400abc”视为400,所有尾随字符都将被忽略,因此无需担心。
如果您肯定想将“400abc”视为无效输入,那么也许您不应该在scanf中使用%d,而是使用%s?
答案 4 :(得分:0)
一种方法是将整行读作一个字符串,并自行检查它是否包含任何非数字。
另一种方法是读取整数,然后使用fgetc()
查看输入,以查看检测到的输入后的下一个字符是否有效。或者您甚至可以使用相同的scanf():
char delim;
if(scanf("%d%c", &c, &delim) == 2 && !isspace(delim))
// the input is invalid
答案 5 :(得分:0)
你可以读取一个字符数组中的数字并通过检查所有字符是否位于ascii范围48到57('0'到'9')中来验证它。如果你没有。是有效的,否则你可以放心地将其视为无效输入。这是演示:
#include<stdio.h>
#include<string.h>
int conv( char * word )
{
int ans=0;
int res=0;
for(int i=0;i<strlen(word);i++)
if(word[i]>='0' && word[i]<='9')
ans=(ans*10) + (word[i] - '0');
else
res=-999;
if(res==-999)
return res;
else
return ans;
}
int main()
{
char a[10];
gets(a);
int b=conv(a);
if(b==-999)
printf("Invalid Entry.\n");
else
printf("Success.No is %d.\n",b);
return 0;
}
您也可以通过检查单词数组中的第一个字符为“ - ”并相应地调整符号来调整负数。
答案 6 :(得分:0)
以下是您的检查功能已重写以解决您的问题,请尝试以下操作:
int check(void){
int n;
char c;
while (EOF==scanf("%d%c", &n,&c) || n < 0 || !isspace(c)){
clear_input();
printf("Invalid, please enter an integer: ");
}
return n;
}
答案 7 :(得分:0)
这是C99,所以使用-std = c99
进行编译#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>
bool getNum(int *n) {
char c, s[10];
if (!scanf("%9s", s))
return false;
for (int i=0; c=s[i]; i++)
if (!isdigit(c))
return false;
*n = atoi(s);
return true;
}
int main() {
int n;
if (getNum(&n))
printf("you entered %d\n", n);
else
printf("you did not enter a number\n");
}