簡體   English   中英

如何檢查C語言中的數值?

[英]How do i check for numeric value in C language?

之前已經問過這個問題,但我從來沒有找到一個清晰簡單的答案,所以我再問一次......

我想知道,如果不使用除stdio.h之外的任何其他庫,如何檢查用戶輸入的是否是數值。 基本上,要求用戶輸入介於0和9之間的值。如果數字介於這兩者之間,則會繼續。 例如,如果數字為12,則它會循環回到問題並再次詢問該數字。

它工作正常,除非我輸入一個字母或十進制數字,它進入一個無限循環...

基本上這是我的問題:如何檢查輸入的值是不是字符和非小數?

這是代碼的開頭:(對不起,它用法語,但你明白了......)

int main()
{

int nb1, nb2, rand_1, rand_2;
int nb_coups = 0;
int points = 0;

printf("\n\n                     ------ BIENVENUE A LA GRANDE ROUE ! ------\n\n");

do{
    //Saisie 1er nombre

    printf("Entrez le premier nombre choisi (entre 0 et 9) : ");
    scanf("%d",&nb1);

    //Tant que le 1er nombre n'est pas compri entre 0 et 9, on le redemande
        while(nb1<0 || nb1>9)
        {
            printf("Nombre incorrect. Entrez le premier nombre choisi (entre 0 et 9) : ");
            scanf("%d",&nb1);
        }
    //On affiche le 1er nombre
    printf("Le nombre choisi est : %d\n\n",nb1);

不要使用scanf()進行控制台輸入。 相反,使用fgets()將stdin中的數據讀入字符串然后解析,或者使用getchar()一次讀取一個字符。 如果你的環境包含這樣的東西,你可能還會考慮getch(),當支持它時,它通常會讀取一個打字字符而不等待之后的返回。

使用fgets和sscanf:

char line [16];

fprintf(stderr, "Entrez le premier nombre choisi (entre 0 et 9) : ");
fgets (line, sizeof(line), stdin);
ret = sscanf(line,"%d",&nb1);

//Tant que le 1er nombre n'est pas compri entre 0 et 9, on le redemande
while((ret == 0) || (nb1 < 0) || (nb1 > 9)) {
    fprintf(stderr, "Nombre incorrect. Entrez le premier nombre choisi (entre 0 et 9) : ");
    fgets (line, sizeof(line), stdin);
    ret = sscanf(line,"%d",&nb1);
}

您應該檢查返回值以清除非數字。

printf("Entrez le premier nombre choisi (entre 0 et 9) : ");
ret = scanf("%d",&nb1);

//Tant que le 1er nombre n'est pas compri entre 0 et 9, on le redemande
    while(!ret && (nb1<0 || nb1>9))
    {
        char ch;
        while ((ch = getchar()) != '\n' && ch != EOF); // Flush the buffer
        printf("Nombre incorrect. Entrez le premier nombre choisi (entre 0 et 9) : ");
        ret = scanf("%d",&nb1);
    }

不要使用scanf,自己進行解析。

char c;
int nb1 = 0;
while(1) {
    c = getchar();
    if(c > '0' && c < '9') {
        nb1 = nb1*10 + (c - '0'); // if you want numbers bigger than 9
    }
    else {
        break; // matches '\n', invalid chars and EOF
    }
}

瞧!

我喜歡一般用途:

一般用途,有一些溢出保護,並允許一些普遍性,如果你喜歡不同的范圍。

#include <ctype.h>
int atoi(char   *s, int N)
{
   int  n;  /* value being accumulated          */
   int  sign;   /* =1 if result is positive, -1 if negative */

   while((N>0)&&(*s == '\t' || *s == ' '))
   {
      N--;
      s++;  /* skip white space             */
   }
   sign=1;      /* assume a positive value          */

   if(*s == '+' || *s == '-')
   {
      N--;
      sign = *s++ == '-' ? -1 : 1;  /* adjust result sign   */
   }
   for(n=0; (N>0)&&isdigit(*s); s++,N--)
      n = n * 10 + *s - '0';

   return (sign * n);   /* result adjusted for sign     */
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM