【发布时间】:2014-02-16 01:05:08
【问题描述】:
我有一些代码,我遇到问题的功能是:
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 个字符而不是每个字符一次。希望这是有道理的,已经有一段时间了,所以任何事情都会有所帮助。
【问题讨论】:
-
你为什么使用全局变量
input、imax、rValue和temp?或者你为什么在发布代码之前删除你的变量定义?您必须错误检查scanf();否则,您将永远不知道何时点击 EOF。看来您可以输入123@或123.等,并且数字是可以的,但如果您输入123a则不是。你真的想用什么字符来终止号码?你说得对,scanf()没有(必然)保护自己免于溢出。你应该推回结束数字的字符吗? -
@JonathanLeffler 抱歉,我将添加变量定义(尽管我不认为它们都是必要的)。这只是一段“快速”的代码,所以我并不担心任何溢出或类似的事情。只是希望 print 语句的行为方式也符合我的意愿。
-
您的验证
if (rValue > imax)应该在if (isdigit(input))代码块中;如果您没有尝试设置rValue,那么测试溢出是没有意义的。它还会影响您的主要问题的逻辑。当你找到一个好的数字时,你应该退出do { … } while (1);循环。 -
@JonathanLeffler 我该如何退出
do-while loop,同时仍单独检查每个char? -
你的答案相当不错;我的在某些方面会很相似,但也会有所不同。总的来说,我比我更喜欢其他解决方案,尽管我的解决方案至少在某些方面更接近您的原始代码。
标签: c if-statement logic do-while