2

これらのフォーラムの内外を検索しましたが、まだ問題が発生しています。私の C の理解はまだ非常に基本的なものです。ユーザーが入力した3つの数値を取り、最高値を計算する小さなプログラムを作成しています。私はそれを釘付けにしました。

ユーザーが整数値のみを入力するようにしたいと思います。指定された数値範囲内 (たとえば、1 から 1000 までの任意の数値) になるまで値を再入力するようにユーザーに促し続けるようにプログラムを設定することができましたが、それだけでは十分ではありません。各値をテストするために 3 つの while ループを使用しましたが、これは入力が整数型である場合にのみ機能します。

トリックは、組み込み関数を使用できないことです。手動で行う必要があります (申し訳ありませんが、言葉の選択が不十分です) char 変数と x = getchar(); を使用しようとしました。ASCII値を取得して条件でテストしますが、ループで動作させることができません。(while/do-while)

また、「for ループ」と配列変数を使用してみましたが、もう一度、ユーザーにプロンプ​​トを表示し続けるのに苦労しています。

また、scanf によって返される値をテストして、その整数が正しいかどうかを確認しようとしましたが、正しい C 構文の知識レベルは level: noob です。ループがループしないか、無限にループします。

サンプルコードは次のとおりです。

int x, y, z =0;

printf("Enter the first number:\n");
scanf("d", &x);
while (condition) /* Here is where I need to determine that the entered val is false */
{
    printf("Wrong input. Re-enter a valid value.\n");
    x =0;
    scanf("%d", &x); /*user re-prompted */
}

ASCII とループを使用する必要があると思いますが、それができません。また、入力された値は、比較のために関数に送信されてから返されます。

誰かが私にアドバイスといくつかのヒントを教えてください。

どうもありがとう

4

4 に答える 4

0
#include <stdio.h>
#include <limits.h>
#include <ctype.h>

int getInteger(int* err){
    int ch;
    int n;//int32
    int takeNum, sign;
    long long int wk;//long long int as int64

    wk=0LL;
    *err = 0;
    takeNum = 0;//flag
    sign = 1;//minus:-1, other:1
/*  //skip space character
    while(EOF!=(ch=getchar()) && (ch == ' ' || ch == '\t' || ch == '\n'));
    ungetc(ch, stdin);
*/
    while(EOF!=(ch=getchar())){
        if(ch == '-'){
            if(takeNum != 0){//in input number
                *err = 1;
                break;
            }
            if(sign == -1){//already sign
                *err = 2;
                break;
            }
            sign = -1;
            continue;
        }
        if(ch >= '0' && ch <= '9'){//isdigit(ch) in ctype.h
            if(takeNum == 0)
                takeNum = 1;
            wk = wk * 10 + (ch - '0')*sign;
            if(INT_MAX < wk || INT_MIN > wk){//overflow
                *err = 3;
                break;
            }
            continue;
        }
        if(ch != '\n'){//input other [-0-9]
            *err = 4;
        }
        break;
    }
    if(takeNum == 0){//not input number
        *err = 5;
    } else {
        n=wk;
    }
    while(ch != '\n' && EOF!=(ch=getchar()));//skip to newline
    return n;
}

int getValue(const char* redoprompt, int low, int high){
    int num, err=0;

    while(1){
        num = getInteger(&err);
        if(err || low > num || high < num)
            printf("%s", redoprompt);
        else
            break;
    }
    return num;
}

#define max(x,y) ((x)>(y))? (x) : (y)

int main(){
    const char *error_message = "Wrong input. Re-enter a valid value.\n";
    int x, y, z, max;

    x = getValue(error_message, 1, 1000);
    y = getValue(error_message, 1, 1000);
    z = getValue(error_message, 1, 1000);
    max = max(max(x,y), z);
    printf("max:%d\n", max);
    return 0;
}
于 2012-08-28T16:23:30.760 に答える
0

これが私の解決策です。バッファオーバーフローに対して安全で、簡単です。

#include <stdio.h>
#define LEN 10

int main() {
    int a;
    char str[LEN];
    fgets( str, LEN, stdin );
    while ( !sscanf( str, "%d", &a ) )
        fgets( str, 10, stdin );
    printf("Num is : %d\n", a);
    return 0;
}
于 2012-08-27T18:55:56.770 に答える
0

fgets、およびstrtol次のようなものを使用する必要があります。

long someValue;

char *bufEnd = NULL;
char buf[128]; // max line size

do {
    printf("enter a value: ");
    fgets(buf, 128, stdin);
    someValue = strtol(buf, &bufEnd, 10); // base 10
} while (bufEnd == buf || *bufEnd != '\n');

printf("got value: %li", someValue);

ここで行っているのはstrtol、 を渡すことで、どこで解析を停止したかを伝える の機能を利用していることbufEndです。

次に、 がbufEndの先頭を指していないことを確認しbuf(この場合、数字で始まっていません)、 が を指していること、または行末をbufEnd指していることを確認します (次のことを確認します)。\nユーザーは のようなものを入力しませんでした。123abcこれstrtolは と解釈されます123)。bufただし、最初に空白文字を削除したい場合があります。

于 2012-08-27T18:41:44.953 に答える
0

あなたは「scanf()」で完全に正しい軌道に乗っています。戻り値を確認するだけです。期待される #/values が得られない場合は、無効な入力が得られました。

char found = FALSE;
int ival;
double x;

while (!found)
{
    printf("Please enter a valid integer: ");
    if (scanf("%d", &ival) !=1) {
      printf ("Invalid!  Please re-enter!\n");
      continue;
    }
    printf("Please enter a valid floating point number: ");
    if (scanf("%lf", &x) !=1) {
      printf ("Invalid!  Please re-enter!\n");
      continue;
    }
    found = TRUE;
}
于 2012-08-27T18:48:06.463 に答える