如何阻止用户在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
一样有效。我认为复制粘贴的代码更受重视。我尝试了这个方法……但它确实有效