我有一些代码,而我遇到麻烦的函数是这样的:
unsigned int getInputData() {
printf("Please input a positive integer number terminated with a carriage return.\n");
do{
scanf("%c", &input);
if(isdigit(input)) {
temp = charToInt(input);
rValue = mergeInt(rValue, temp);
}
if(rValue >= imax) {
rValue = 0;
printf("ERROR: That is too large of an integer. Please try again. \n");
}
else if(isalpha(input)){
rValue = 0;
printf("This is not a integer. Please try again. \n");
}
else{
printf("OK. This is a good number. \n");
}
} while(1);
}
我正在char
逐个扫描,将其合并为一个int
。正是我要执行的操作,但是我只希望"OK. This is a good number."
用户输入时将其打印一次。示例:如果有人输入:12345
我希望它返回:"OK. This is a good number."
这5个字符一次,而不是每个字符一次。希望这很有意义,花了一段时间,所以任何事情都会有所帮助。
您的代码背后存在巨大的逻辑问题:
您说要在用户输入多个数字时告诉您这是否是一个好数字,但是您一次只能读取一个字符,而没有定义数字的结尾。尽管您确实指定以回车符结尾,但是您并未以这种方式设计算法,因此您从不检查\n
字符。
getInputData()
函数定义了一个返回值,但您从未从该函数返回。input
是数字来更新值,但是对于错误,只有在它是字母字符的情况下,您才会显示错误。基本上,为了保持编写算法的方式,这是另一种方法:
unsigned int getInputData() {
char input;
long value=0;
do {
scanf("%c", &input);
if (isdigit(input))
value = value*10+input+'0';
else if (input == '\n')
return 1;
else
return 0;
} while(1);
}
int main() {
printf("Please input a positive integer number terminated with a carriage return.\n");
if (getInputData() == 1)
printf("OK. This is a good number.\n");
else
printf("This is not a integer. Please try again. \n");
return 0;
}
但我确实从无限循环中退出,以便能够检查结果。
注意:出于示例的目的,我没有检查溢出。NB1:我一直在使用,scanf()
以保持接近您的代码,但是如果您只想一次读取一个字符,则最好使用getchar()
更简单,更快的方法。NB2:您还可以通过使用以下更多功能来简化代码scanf()
:
unsigned int getInputData() {
unsigned input;
long value=0;
int n;
do {
n = scanf("%u", &input);
if (n == 0)
return 0;
else
return 1;
} while(1);
}
您甚至可以尝试使用scanf("%a[0-9]")
GNU扩展。请参阅man scanf
以获取更多详细信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句