1

ユーザーに番号を尋ねるプログラムをCで書いています。

数字はゼロより大きい必要があり、数字の前後に文字を含めることはできません。(つまり:400は有効ですがabc、または400abcそうabc400ではありません)。プログラムに 以外のすべてを無効にすることができます400abc。入力が有効になってから無効になった場合、入力を無効にするにはどうすればよいですか? (私はCクラスの入門に約2か月なので、知識は非常に限られています。)

    #include<stdio.h>

int check(void);
void clear_input(void);

main()
{
    int num;
    printf("Please enter a number: ");

    num = check();
    printf("In Main %d\n", num);

}

int check(void){

    int c;

    scanf("%d", &c);
    while (c < 0){
        clear_input();
        printf("Invalid, please enter an integer: ");
        scanf("%d", &c);
    }

    return c;
}

void clear_input(void){
    char junk;
    do{
        scanf("%c", &junk);
    }while (junk != '\n');
}
4

8 に答える 8

6

また、ユーザー入力からスキャンされた各文字の ascii 値が 48 ~ 57 の範囲内にある必要があるかどうかを確認することもできます。その場合にのみ整数値になります。

于 2012-07-05T02:14:27.170 に答える
1

strtolを使用して実行できますが、追加の作業が必要です。

このコードを実行した後:

char *endptr;
int n = strtol(num_text, &endptr, 10);

n番号が含まれます。ただし、次のことを確認する必要があります
。 1. *endptr=='\0'- これはstrtol、途中で停止しなかったことを意味します。では400abcendptrを指しabcます。末尾の空白を許可することもできます (この場合、endptrがすべて空白の文字列を指していることを確認してください
。2 num_text. 空ではありません。この場合、strtolは 0 を返しますが、空の文字列は有効な数値ではありません。

于 2012-07-05T06:40:17.300 に答える
0

を使用して、入力を行として読み取りますfgets

すべての文字が数字かどうかを確認します。

そうでない場合は無効です。はいの場合sscanfは、行を int にするために使用します。

int が範囲内にあるかどうかを確認します。あなたは終わった。

于 2012-07-05T02:14:33.577 に答える
0

%d を指定した Scanf は、"400abc" を 400 として扱います。末尾の文字はすべて無視されるため、心配する必要はありません。

「400abc」を無効な入力として確実に扱いたい場合は、scanf で %d を使用するのではなく、代わりに %s を使用する必要がありますか?

于 2012-07-05T02:16:21.710 に答える
0

以下は、問題を解決するために書き直されたチェック関数です。これを試してください。

int check(void){

    int n;
    char c;

    while (EOF==scanf("%d%c", &n,&c) || n < 0 || !isspace(c)){
        clear_input();
        printf("Invalid, please enter an integer: ");
    }

    return n;
}
于 2012-07-05T10:20:52.607 に答える
0

文字配列の数値を読み取り、すべての文字が 48 から 57 ('0' から '9') の ASCII 範囲内にあるかどうかを確認することで検証できます。それ以外の場合は、安全に無効な入力と見なすことができます。デモンストレーションは次のとおりです。

#include<stdio.h>
#include<string.h>
int conv( char * word )
{
    int ans=0;
    int res=0;
    for(int i=0;i<strlen(word);i++)
        if(word[i]>='0' && word[i]<='9')
            ans=(ans*10) + (word[i] - '0');
        else
            res=-999;
    if(res==-999)
        return res;
    else
        return ans;
}
int main()
{
    char a[10];
    gets(a);
    int b=conv(a);
    if(b==-999)
        printf("Invalid Entry.\n");
    else
        printf("Success.No is %d.\n",b);
    return 0;
}

単語配列の最初の文字が「-」であることを確認し、それに応じて符号を調整することで、ネガを調整することもできます。

于 2012-07-05T07:24:10.687 に答える
0

これは C99 なので、-std=c99 でコンパイルします。

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

bool getNum(int *n) {
    char c, s[10];
    if (!scanf("%9s", s))
        return false;
    for (int i=0; c=s[i]; i++)
        if (!isdigit(c))
    return false; 
    *n = atoi(s);
    return true;
}

int main() {
    int n;
    if (getNum(&n))
        printf("you entered %d\n", n);
    else
        printf("you did not enter a number\n");
}
于 2012-07-05T16:49:08.183 に答える
0

1 つの方法は、行全体を文字列として読み取り、数字以外が含まれているかどうかを自分で確認することです。

もう 1 つの方法は、整数を読み取ってから、 を使用して入力を調べfgetc()、検出された入力の次の文字が有効かどうかを確認することです。または、これに同じ scanf() を使用することもできます。

char delim;
if(scanf("%d%c", &c, &delim) == 2 && !isspace(delim))
  // the input is invalid
于 2012-07-05T07:02:21.140 に答える