我已经搜索过这些论坛,但我仍然遇到了麻烦。我对C的理解仍然很基础。我正在创建一个小程序,它接受用户输入的3个数值,然后计算最高值。我钉了那个。
我现在想确保用户只输入整数值。我设法让prog继续提示用户重新输入值,直到它在指定的数值范围内(例如,1到1000之间的任何数字,包括一块蛋糕),但这还不够好。我使用3个while循环来测试每个值,但这只有在输入类型为整数时才有效。
诀窍是我无法使用内置函数。它需要是手动的(抱歉,选择不好的单词)我试图使用char变量和x = getchar();获取ASCII值并在条件下测试它,但我不能让它在循环中工作。 (while / do-while)
我也尝试过使用“for循环”和数组变量,但又一次努力让它继续提示用户。
我还尝试测试scanf返回的值,看看它的整数,但我的正确C语法知识水平是否为:noob。我的循环不循环或无限循环。
以下是一些示例代码:
int x, y, z =0;
printf("Enter the first number:\n");
scanf("d", &x);
while (condition) /* Here is where I need to determine that the entered val is false */
{
printf("Wrong input. Re-enter a valid value.\n");
x =0;
scanf("%d", &x); /*user re-prompted */
}
我知道我必须使用ASCII和循环,但我无法达到它。此外,输入的值将发送到函数进行比较,然后返回。
有人可以给我一些建议和一些提示吗?
非常感谢
答案 0 :(得分:0)
您必须使用fgets
和strtol
:
long someValue;
char *bufEnd = NULL;
char buf[128]; // max line size
do {
printf("enter a value: ");
fgets(buf, 128, stdin);
someValue = strtol(buf, &bufEnd, 10); // base 10
} while (bufEnd == buf || *bufEnd != '\n');
printf("got value: %li", someValue);
我们在这里做的是通过传入strtol
,我们正在利用bufEnd
告诉我们停止解析的位置的能力。
然后,我们确保bufEnd
没有指向buf
的开头(在这种情况下,它不是以数字开头),并且还要检查以确保bufEnd
指向\n
或该行的结尾(确保用户未输入123abc
之类的内容,strtol
将其解释为123
})。但是,您可能希望首先修剪buf
个空白字符。
答案 1 :(得分:0)
你使用“scanf()”绝对走在正确的轨道上。只需检查返回值。如果没有得到预期的#/值,则输入无效:
char found = FALSE;
int ival;
double x;
while (!found)
{
printf("Please enter a valid integer: ");
if (scanf("%d", &ival) !=1) {
printf ("Invalid! Please re-enter!\n");
continue;
}
printf("Please enter a valid floating point number: ");
if (scanf("%lf", &x) !=1) {
printf ("Invalid! Please re-enter!\n");
continue;
}
found = TRUE;
}
答案 2 :(得分:0)
这是我的解决方案。它可以安全地防止缓冲区溢出并且直截了当。
#include <stdio.h>
#define LEN 10
int main() {
int a;
char str[LEN];
fgets( str, LEN, stdin );
while ( !sscanf( str, "%d", &a ) )
fgets( str, 10, stdin );
printf("Num is : %d\n", a);
return 0;
}
答案 3 :(得分:0)
#include <stdio.h>
#include <limits.h>
#include <ctype.h>
int getInteger(int* err){
int ch;
int n;//int32
int takeNum, sign;
long long int wk;//long long int as int64
wk=0LL;
*err = 0;
takeNum = 0;//flag
sign = 1;//minus:-1, other:1
/* //skip space character
while(EOF!=(ch=getchar()) && (ch == ' ' || ch == '\t' || ch == '\n'));
ungetc(ch, stdin);
*/
while(EOF!=(ch=getchar())){
if(ch == '-'){
if(takeNum != 0){//in input number
*err = 1;
break;
}
if(sign == -1){//already sign
*err = 2;
break;
}
sign = -1;
continue;
}
if(ch >= '0' && ch <= '9'){//isdigit(ch) in ctype.h
if(takeNum == 0)
takeNum = 1;
wk = wk * 10 + (ch - '0')*sign;
if(INT_MAX < wk || INT_MIN > wk){//overflow
*err = 3;
break;
}
continue;
}
if(ch != '\n'){//input other [-0-9]
*err = 4;
}
break;
}
if(takeNum == 0){//not input number
*err = 5;
} else {
n=wk;
}
while(ch != '\n' && EOF!=(ch=getchar()));//skip to newline
return n;
}
int getValue(const char* redoprompt, int low, int high){
int num, err=0;
while(1){
num = getInteger(&err);
if(err || low > num || high < num)
printf("%s", redoprompt);
else
break;
}
return num;
}
#define max(x,y) ((x)>(y))? (x) : (y)
int main(){
const char *error_message = "Wrong input. Re-enter a valid value.\n";
int x, y, z, max;
x = getValue(error_message, 1, 1000);
y = getValue(error_message, 1, 1000);
z = getValue(error_message, 1, 1000);
max = max(max(x,y), z);
printf("max:%d\n", max);
return 0;
}