0

数値を取得して電卓が表示するようにその数値を表示するために書いているプログラム (以下を参照) は問題なくコンパイルされていますが、実行しようとすると数値を入力できますが、何も起こりません。期待どおりにそれ以上の出力が表示されないため、「ハング」しているように見えます。誰が問題が何であるかを知っているでしょうか?

#include <stdio.h>
#define MAX_DIGITS 20

char segments[10][7] =              /* seven segment array */
    {{'1','1','1','1','1','1','0'}, /* zero */
     {'0','1','1','0','0','0','0'}, /* one */
     {'1','1','0','1','1','0','1'}, /* two */
     {'1','1','1','1','0','0','1'}, /* three */
     {'0','1','1','0','0','1','1'}, /* four */
     {'1','0','1','1','0','1','1'}, /* five */
     {'1','0','1','1','1','1','1'}, /* six */
     {'1','1','1','0','0','0','0'}, /* seven */
     {'1','1','1','1','1','1','1'}, /* eight */
     {'1','1','1','0','0','1','1'}};/* nine */
char digits[3][MAX_DIGITS * 4];     /* digits array */
int i, j;                           /* count variables */
int adjust;                         /* output formatting */

int main(void) {
    clear_digits_array();

    int digit[20];
    for (i = 0; i < 20; i++) {
        digit[i] = 0;
    }

    int count = 20;
    int position = 0;

    printf("Enter a number: ");

    int number = scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
            &digit[0],
            &digit[1],
            &digit[2],
            &digit[3],
            &digit[4],
            &digit[5],
            &digit[6],
            &digit[7],
            &digit[8],
            &digit[9],
            &digit[10],
            &digit[11],
            &digit[12],
            &digit[13],
            &digit[14],
            &digit[15],
            &digit[16],
            &digit[17],
            &digit[18],
            &digit[19]);                        //NOTHING HAPPENS AFTER HERE

    printf("Got input, number is %d", number); 

    while (count > 0) {
        printf("Reading digits, count is %d", count);
        process_digit(digit[20 - count], position);
        position++;
        count--;
    }

    print_digits_array();
    printf("\n");
    return 0;
}

void clear_digits_array(void) {
    /* fill all positions in digits array with blank spaces */
    for (i = 0; i < 3; i++) {
        for (j = 0; j < (MAX_DIGITS * 4); j++) {
            digits[i][j] = ' ';
        }
    }
}

void process_digit(int digit, int position) {
    /* check each segment to see if segment should be filled in for given digit */
    for (i = 0; i < 7; i++) {
        printf("Processing digit %d at position %d, i is %d", digit, position, i);
        if (segments[digit][i] == 1) {
            switch (i) {
                case 0: digits[0][(position * 4) + 1] = '_';
                        break;
                case 1: digits[1][(position * 4) + 2] = '|';
                        break;
                case 2: digits[2][(position * 4) + 2] = '|';
                        break;
                case 3: digits[2][(position * 4) + 1] = '_';
                        break;
                case 4: digits[2][(position * 4) + 0] = '|';
                        break;
                case 5: digits[1][(position * 4) + 0] = '|';
                        break;
                case 6: digits[1][(position * 4) + 1] = '_';
                        break;
            }
        }
    }
}

void print_digits_array(void) {
    /* print each character in digits array */
    for (i = 0; i < 3; i++) {
        for (j = 0; j < (MAX_DIGITS * 4); j++) {
            printf("%c", digits[i][j]);
        }
        printf("/n");
    }
}
4

3 に答える 3

2

コードには次が含まれます。

printf("Enter a number: ");

int number = scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
        &digit[0],
        &digit[1],
        &digit[2],
        &digit[3],
        &digit[4],
        &digit[5],
        &digit[6],
        &digit[7],
        &digit[8],
        &digit[9],
        &digit[10],
        &digit[11],
        &digit[12],
        &digit[13],
        &digit[14],
        &digit[15],
        &digit[16],
        &digit[17],
        &digit[18],
        &digit[19]);                        //NOTHING HAPPENS AFTER HERE

20 桁の数字を入力しましたか? そうでない場合は、scanf()さらに数字を入力するのを待っています。

からの戻り値scanf()は、入力した値ではなく、正常に変換された数値の数 (例では 0..20) であることに注意してください。


それが問題ですか?ユーザーが入力できる数字の最大数が 20 であるようにしようとしました。それ以上入力された場合は無視され、入力された数字が少ない場合はそれらのみが考慮されます (たとえば、5 つ入力された場合は、 5 が使用されます)。この種のことを行う簡単な方法はありますか?

はい、それが問題だと思います。

おそらくもっと簡単な方法がいくつかあります。私は使用したくなるでしょう:

char buffer[22];  // 20 digits, newline, null
if (fgets(buffer, sizeof(buffer), stdin) != EOF)
{
    size_t len = strlen(buffer);
    if (len >= sizeof(buffer) - 1)
    {
        fprintf(stderr, "You entered too long a string (maximum 20 digits)\n");
        exit(EXIT_FAILURE);
    }
    if (len > 0)
        buffer[--len] = '\0';  // Zap newline — carefully
    for (int i = 0; i < len; i++)
    {
        if (!isdigit(buffer[i]))
        {
            fprintf(stderr, "Non-digit %c found\n", buffer[i]);
            exit(EXIT_FAILURE);
        }
    }
    ...and from here, process the digits in buffer, one at a time...
    ...Use buffer[i] - '0' to get a number 0..9 from the character in buffer...
}

別のオプションはlong long数値を使用することですが、これは最大 18 桁 (符号付き) または 19 桁 (符号なし) しか得られず、19 または 20 の値も範囲内にあります。次に、除算とモジュラス演算を使用して、数値から数字を取り除きます。

long long value;
if (scanf("%lld", &value) == 1)
{
    if (value < 0)
        ...error processing...
    do
    {
        int digit = value % 10;
        value /= 10;
        ...process digit...
    } while (value > 0);
}

これにはいくつかの利点がありますが、実際にはfgets()、入力行を読み取り、sscanf()または strtoll()数値を変換して検証するために使用したくなるでしょう。これは見た目ほど単純ではありません。特にから返されるエラーstrtoll()は多く、微妙であり、scanf()オーバーフローした数値を適切に処理するファミリはありません。scanf()ただし、 18 桁を超えないように制限することもできますが%18lld、それは、ユーザーが 19 桁以上を入力した場合、次の読み取り試行で残りを取得することを意味しますscanf()scanf()そのため、特にプログラムの 1 回の実行で複数の数値を変換する必要がある場合は、処理も簡単ではありません。

これらの注意事項を取り除けば、通常は分別のある人から情報を提供してもらうことで「十分な」仕事をすることができます。難しいのは、プログラムを防爆 (フールプルーフ — つまり、愚か者に対する証明) にするプロセスです。fgets()( のように)読み込まれた文字列全体を報告できると、有意義なエラー報告が容易になります。ではscanf()、何か問題が発生する前に入力して消費した文字を見ることができません。

于 2012-11-28T04:59:16.813 に答える
0

GDB を使用します。ここにその紹介があります http://www.gnu.org/software/gdb/ このチュートリアルも見てください http://www.cs.cmu.edu/~gilpin/tutorial/

于 2012-11-28T04:58:34.593 に答える
0
int number = scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
            &digit[0],
            &digit[1],
            &digit[2],
            &digit[3],
            &digit[4],
            &digit[5],
            &digit[6],
            &digit[7],
            &digit[8],
            &digit[9],
            &digit[10],
            &digit[11],
            &digit[12],
            &digit[13],
            &digit[14],
            &digit[15],
            &digit[16],
            &digit[17],
            &digit[18],
            &digit[19]);         

loopここで使うのは良くないと思う

for (i = 0; i < 20; i++) 
        scanf("%d",&digit[i]);

そして、必要な場合は、number このようにします

int number = i;ループが終了したとき。

これを試すこともできます

char buf[12]; 
while((c=getchar())!=EOF && i < 20)
{
 buf[j++] =c;
 if((c == '\n' || c == ' ' || c == '\t') && (sscanf(buf,"%d",&digit[i])) == 1)
   {
    i++;
    j = 0;
   }
 }

EOFの場合は、押す必要がありますCTRL+D 。このようにして、20個以下の整数を取ることができます

于 2012-11-28T05:01:35.997 に答える