2014-01-28 40 views
2

我正在写一个代码,要求用户输入10个整数,然后将它们反馈给他。我想创建一个“scanf检查”来限制字符输入。 while循环的工作原理是它不接受char,但会跳过一个整数输入。scanf检查while while循环来限制整数输入

int main() 
{ 

    int i = 0, number[10] = {0}; 
    char buf[128] = {0}; 

    for (i = 0; i < 10; i++) 
    { 
     printf("Please input number %d : ", i+1); 

     while(scanf("%d", &number[i]) != 1) 
     { 
     scanf("%s", &buf); 
     printf("Sorry, [%s] is not a number. Please input number %d : ", &buf, i); 
     } 
    } 

    for (i = 0; i < 10; i++) 
    { 
    printf("\n Number %d is %d", (10-i), number[9-i]); 
    } 

    return EXIT_SUCCESS; 
} 
+0

下一'scanf'声明 –

+9

@SakthiKumar之前尝试'fflush(标准输入)':不,从不使用'fflush(stdin)' - 它会在许多平台上导致UB。 –

+1

@SakthiKumar,谢谢你的输入。 Paul R,你会推荐什么? – MIIJ

回答

4

正如指出的H2CO3,不使用scanf,另一种是fgetsstrtol

int i, number[10] = {0}; 
char buf[128], *p; 

for (i = 0; i < 10; i++) { 
    printf("Please input number %d : ", i+1); 
    while (1) { 
     fgets(buf, sizeof(buf), stdin); 
     if ((p = strchr(buf, '\n')) != NULL) { 
      *p = '\0'; 
     } 
     number[i] = (int)strtol(buf, &p, 10); 
     if (p == buf || *p != '\0') { 
      printf("Sorry, [%s] is not a number. Please input number %d : ", buf, i + 1); 
     } else { 
      break; 
     } 
    } 
} 
for (i = 0; i < 10; i++) { 
    printf("\n Number %d is %d", (10-i), number[9-i]); 
} 
return EXIT_SUCCESS; 
+2

@MIIJ如果您发现答案有帮助(并且正确),那么通过对答案进行投票表决来感谢他们。点击帖子左侧的向上箭头。因此,在这种情况下,可能会回答并接受你最喜欢的那个(你已经做了)。 – Lundin

+1

@Lundin,感谢您的提示,我曾尝试过,但似乎我没有足够的“声誉”这样做。我会尽快这样做。 – MIIJ

+0

@Alter Mann,是否正确? * p ='\ 0'(如果(buf,'\ n'))!= NULL)//如果buf保存'\ n'值(返回键) ; // p char变量被设置为空终止符,表示字符串的结束] ... ... x =(int)strtol(buf,&p,10); // x是在基础10处从buf中的字符解析,直到p的值为int。] ...如果(p == buf || * p!='\ 0') //如果p没有被解析,那么它就等于缓冲区值 // 2)我不明白第二个实体(当它只等于'return'时)?] ...什么时候做它检查信件? – MIIJ

1

该代码也适用于整数也。我发现的唯一错误是在打印抱歉信息时,您正在打印i,应该是i+1

int i = 0, number[10] = {0}; 
    char buf[128] = {0}; 

    for (i = 0; i < 10; i++) 
    { 
     printf("Please input number %d : ", i+1); 

     while(scanf("%d", &number[i]) != 1) 
     { 
     scanf("%s", &buf); 
     printf("Sorry, [%s] is not a number. Please input number %d : ", &buf, i+1); 
     } 
    } 

    for (i = 0; i < 10; i++) 
    { 
    printf("\n Number %d is %d", (10-i), number[9-i]); 
    }