如何阻止用户在C中输入字符作为int输入
这是我代码的一部分:如何阻止用户在C中输入字符作为int输入,c,user-input,C,User Input,这是我代码的一部分: printf("\nEnter amount of adult tickets:"); scanf("%d", &TktAdult); while (TktAdult<0){ printf("\nPlease enter a positive number!"); printf("\nEnter amount of adult tickets:"); scanf("%d", &Tk
printf("\nEnter amount of adult tickets:");
scanf("%d", &TktAdult);
while (TktAdult<0){
printf("\nPlease enter a positive number!");
printf("\nEnter amount of adult tickets:");
scanf("%d", &TktAdult);
}
printf(“\n输入成人票金额:”);
scanf(“%d”&tkt);
while(tkt)成人
但我如何添加到它,这样它也可以阻止用户输入字符
您无法阻止用户输入字符值。您可以做的是检查tkt成人
是否已成功扫描。
如果没有,则清除标准DIN中的所有内容:
bool valid = false;
while (true) {
...
if (scanf("%d", &TktAdult) != 1) {
int c;
while ((c = getchar()) != EOF && c != '\n');
} else {
break;
}
}
更好的选择是使用,然后使用解析行
另请参见:
但我如何添加到它,这样它也可以阻止用户输入字符
您无法阻止用户输入字符值。您可以做的是检查tkt成人
是否已成功扫描。
如果没有,则清除标准DIN中的所有内容:
bool valid = false;
while (true) {
...
if (scanf("%d", &TktAdult) != 1) {
int c;
while ((c = getchar()) != EOF && c != '\n');
} else {
break;
}
}
更好的选择是使用,然后使用解析行
另请参见:
…阻止用户输入负值
不可能。用户输入各种胡言乱语。相反,读取一行用户输入并分析其正确性。使用fgets()
进行输入,然后使用sscanf()
,strtol()
等进行分析
// return -1 on EOF
int GetPositiveNumber(const char *prompt, const char *reprompt) {
char buf[100];
fputs(prompt, stdout);
fflush(stdout);
while (fgets(buf, sizeof buf, stdin)) [
int value;
if (sscanf(buf, "%d", &value) == 1 && value > 0) {
return value;
}
fputs(reprompt, stdout);
fflush(stdout);
}
return -1;
}
// Usage
int TktAdult = GetPositiveNumber(
"\nEnter amount of adult tickets:" ,
"\nPlease enter a positive number!");
if (TktAdult < 0) Handle_End_of_File();
else Success(TktAdult);
//在EOF上返回-1
int GetPositionEnumber(常量字符*提示,常量字符*重新提示){
char-buf[100];
FPUT(提示、标准输出);
fflush(stdout);
while(fgets(buf、sizeof buf、stdin))[
int值;
如果(sscanf(buf),%d,&value)==1&&value>0){
返回值;
}
FPUT(复制、标准输出);
fflush(stdout);
}
返回-1;
}
//用法
int tkt成人=GetPositionEnumber(
“\n输入成人票的金额:”,
“\n请输入一个正数!”);
if(tkt成人<0)处理_文件()的_End_;
其他成功(tkt成人);
…阻止用户输入负值
不可能。用户输入各种胡言乱语。相反,读取一行用户输入并分析其正确性。使用fgets()
进行输入,然后使用sscanf()
,strtol()
等进行分析
// return -1 on EOF
int GetPositiveNumber(const char *prompt, const char *reprompt) {
char buf[100];
fputs(prompt, stdout);
fflush(stdout);
while (fgets(buf, sizeof buf, stdin)) [
int value;
if (sscanf(buf, "%d", &value) == 1 && value > 0) {
return value;
}
fputs(reprompt, stdout);
fflush(stdout);
}
return -1;
}
// Usage
int TktAdult = GetPositiveNumber(
"\nEnter amount of adult tickets:" ,
"\nPlease enter a positive number!");
if (TktAdult < 0) Handle_End_of_File();
else Success(TktAdult);
//在EOF上返回-1
int GetPositionEnumber(常量字符*提示,常量字符*重新提示){
char-buf[100];
FPUT(提示、标准输出);
fflush(stdout);
while(fgets(buf、sizeof buf、stdin))[
int值;
如果(sscanf(buf),%d,&value)==1&&value>0){
返回值;
}
FPUT(复制、标准输出);
fflush(stdout);
}
返回-1;
}
//用法
int tkt成人=GetPositionEnumber(
“\n输入成人票的金额:”,
“\n请输入一个正数!”);
if(tkt成人<0)处理_文件()的_End_;
其他成功(tkt成人);
以下代码拒绝以下用户输入:
- 由//1处理的非数字
- 由//2处理的负数
- 正数后跟由//3处理的非数字字符
while (1) {
printf("\nEnter amount of adult tickets: ");
if (scanf("%d", &TktAdult) < 0 || // 1
TktAdult < 0 || // 2
((next = getchar()) != EOF && next != '\n')) { // 3
clearerr(stdin);
do
next = getchar();
while (next != EOF && next != '\n'); // 4
clearerr(stdin);
printf("\nPlease enter a positive number!");
} else {
break;
}
}
while(1){
printf(“\n输入成人票金额:”);
如果(scanf(“%d”,&tkt成人)<0 | |//1
tkt成人<0 | |//2
((next=getchar())!=EOF&&next!='\n')){//3
clearerr(标准偏差);
做
next=getchar();
while(next!=EOF&&next!='\n');//4
clearerr(标准偏差);
printf(“\n请输入正数!”);
}否则{
打破
}
}
另外,//4在第3种情况下清除缓冲非数字字符的标准输入(即123sda-scanf接受123,但在缓冲区中保留“sda”)。以下代码拒绝以下用户输入:
- 由//1处理的非数字
- 由//2处理的负数
- 正数后跟由//3处理的非数字字符
while (1) {
printf("\nEnter amount of adult tickets: ");
if (scanf("%d", &TktAdult) < 0 || // 1
TktAdult < 0 || // 2
((next = getchar()) != EOF && next != '\n')) { // 3
clearerr(stdin);
do
next = getchar();
while (next != EOF && next != '\n'); // 4
clearerr(stdin);
printf("\nPlease enter a positive number!");
} else {
break;
}
}
while(1){
printf(“\n输入成人票金额:”);
如果(scanf(“%d”,&tkt成人)<0 | |//1
tkt成人<0 | |//2
((next=getchar())!=EOF&&next!='\n')){//3
clearerr(标准偏差);
做
next=getchar();
while(next!=EOF&&next!='\n');//4
clearerr(标准偏差);
printf(“\n请输入正数!”);
}否则{
打破
}
}
另外,//4在第//3种情况下清除缓冲非数字字符的标准输入(即123sda-scanf接受123,但在缓冲区中保留“sda”。\include
int main(){
int x=0.0;
int readReasult;
而(1)
{
readReasult=scanf(“%d”和&x);
如果(readReasult<0)中断;
如果(readReasult==1){
如果(x>=0)
printf(“下一个号码:%d\n”,x);
其他的
printf(“不应为负值\n”);
}否则{
clearerr(标准偏差);
scanf(“%*s”);
printf(“输入错误”);
}
}
返回0;
}
#包括
int main(){
int x=0.0;
int readReasult;
而(1)
{
readReasult=scanf(“%d”和&x);
如果(readReasult<0)中断;
如果(readReasult==1){
如果(x>=0)
printf(“下一个号码:%d\n”,x);
其他的
printf(“不应为负值\n”);
}否则{
clearerr(标准偏差);
scanf(“%*s”);
printf(“输入错误”);
}
}
返回0;
}
将数据读取到char*缓冲区,并对其进行解析。您是否尝试过使用atoi?@HRgiger不建议使用atoi,它是旧的不安全且难以使用。@HRgiger请查看并提供一个。将数据读取到char*缓冲区,并对其进行解析。您尝试过使用atoi吗?@HRgiger不建议使用atoi,它是旧的不安全且难以使用。@HRgiger请查看并提供一个。I我也不建议使用scanf,因为与fgets
+strtoull
@cat相比,scanf很难使用,而且容易出错。我也建议使用scanf,链接对此进行了很好的解释。sscanf()
方法与strtoull
一样有效。我认为复制粘贴的代码更受重视。我尝试了这个方法……但它确实有效