14

これは、ユーザーが0未満または23を超える文字または整数を入力できないようにするためのCコードです。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    const char *input;
    char *iPtr;
    int count = 0;
    int rows;

    printf("Enter an integer: ");
    scanf("%s", input);
    rows = strtol(input, &iPtr, 0);
    while( *iPtr != '\0') // Check if any character has been inserted
    {
        printf("Enter an integer between 1 and 23: ");
        scanf("%s", input);
    }
    while(0 < rows && rows < 24) // check if the user input is within the boundaries
    {
        printf("Select an integer from 1 to 23: ");
        scanf("%s", input);
    }  
    while (count != rows)  
    {  
        /* Do some stuff */  
    }  
    return 0;  
}

途中でやったので、少し腕立て伏せしていただければ幸いです。

4

5 に答える 5

37

scanf("%d",&rows)の代わりに使用scanf("%s",input)

これにより、intに変換しなくても、stdinから整数値を直接取得できます。

ユーザーが数字以外の文字を含む文字列を入力した場合は、次の文字列の前にstdinをクリーンアップする必要がありますscanf("%d",&rows)

コードは次のようになります。

#include <stdio.h>  
#include <stdlib.h> 

int clean_stdin()
{
    while (getchar()!='\n');
    return 1;
}

int main(void)  
{ 
    int rows =0;  
    char c;
    do
    {  
        printf("\nEnter an integer from 1 to 23: ");

    } while (((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin()) || rows<1 || rows>23);

    return 0;  
}

説明

1)

scanf("%d%c", &rows, &c)

これは、ユーザー入力から整数を期待し、それに近い数字以外の文字を期待することを意味します。

例1:ユーザーが入力aaddkENTER、scanfは0を返します。大文字と小文字は区別されません。

例2:ユーザーが入力45ENTER、scanfは2を返します(2つの要素がキャプされます)。ここ%dにキャッピングが45あり、%cキャッピング\n

例3:ユーザーが入力45aaaddENTER、scanfは2を返します(2つの要素がキャプされます)。ここ%dにキャッピングが45あり、%cキャッピングa

2)

(scanf("%d%c", &rows, &c)!=2 || c!='\n')

例1:この条件はTRUE、scanfが0!=2

例2の場合:この条件はFALSE、scanfが戻り2c == '\n'

例3の場合:この条件はTRUE、scanfが戻り2c == 'a' (!='\n')

3)

((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin())

clean_stdin()関数が常にTRUE戻るためです1

例1の場合:(scanf("%d%c", &rows, &c)!=2 || c!='\n')TRUE、後の条件を&&チェックする必要があるため、clean_stdin()が実行され、条件全体はTRUE

例2の場合:これ(scanf("%d%c", &rows, &c)!=2 || c!='\n')FALSE、後の条件&&がチェックされないため(結果が条件全体になるためFALSE)、clean_stdin()実行されず、条件全体がFALSE

例3の場合:(scanf("%d%c", &rows, &c)!=2 || c!='\n')TRUE、後の条件を&&チェックする必要があるため、clean_stdin()が実行され、条件全体はTRUE

したがってclean_stdin()、ユーザーが数字以外の文字を含む文字列を入力した場合にのみ実行されることに注意してください。

そして、この状態は、ユーザーが他に何も入力しない場合にのみ((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin())返されますFALSEinteger

そして、条件((scanf("%d%c", &rows, &c)!=2 || c!='\n') && clean_stdin())FALSEであり、integerがとの間に1ある23場合、whileループは中断されます。そうでない場合、whileループは続行されます。

于 2012-12-31T08:51:46.923 に答える
1

1から23までの整数を読み取る関数、または非整数の場合は0を返す関数を作成できます。

例えば

int getInt()
{
  int n = 0;
  char buffer[128];
  fgets(buffer,sizeof(buffer),stdin);
  n = atoi(buffer); 
  return ( n > 23 || n < 1 ) ? 0 : n;
}
于 2012-12-31T10:13:42.323 に答える
0

strtolユーザーに再試行を求めるループ内で呼び出しを繰り返す必要があります。実際、while のdo { ... } while(...);代わりにループを作成すると、同じ種類の 2 回の動作が繰り返されなくなります。

また、コードがループ内にあるかどうかを確認できるように、コードをフォーマットする必要があります。

于 2012-12-31T08:55:11.787 に答える