2

私は自分のクラスで C の学習を始めたばかりで、この課題に取り組んでいますが、この部分は当惑しています。基本的に次のようなコードがあります。

#include <stdio.h>
#include <string.h>

int main(void)
{
    int one = 0;
    int two = 0;
    char oneWord[100]; 
    char twoWord[100];

    printf("Enter a two digit number: ");
    scanf("%d%d", &one, &two);

    strcpy(firstWord, "Test");
    strcpy(secondWord, "Two");

    printf("%s", firstWord);

    return 0;
}

さて、プログラムのロジック/目的はさておき、私が理解できないのは、そのscanfステートメントが無限ループを引き起こしている理由です? コメントアウトしたときにそれが問題の原因であると判断し、最終的なprintfステートメントは問題なく機能しました。

に変更してscanf("%d,%d", %one, %two)みましたが、入力にコンマを追加するとうまくいくようでした。しかし、55 のような数字を 2 桁に分割できるようにしたいのです。ここで私は正確に何を間違っていますか?

4

3 に答える 3

7

遭遇するのは無限ループではなくscanf、さらに入力を待つことです。

d-format-specifier は 10 進数を意味するため、「0」、「41」、または「2342345」のようなものです。

最初の番号を入力した後、プログラムが続行されることを期待しますが、最初の番号をscanf完了したばかりな%dのでscanf、2番目の番号を満たすのを待っています%d. これはあなたには無限ループのように見えますが、実際にはscanfあなたが命じたことを実行しています。

scanfあなたが望む各数字の桁数を推測することはできません。ただし、各情報が何文字で構成されているかを示す width-specifier を使用して、希望する方法を伝えることができます。

#include <stdio.h>

int main () {
    int a, b;
    scanf("%2d%1d", &a, &b);
    printf("%d, %d", a, b);
} 

エラー処理あり:

#include <stdio.h>

int main () {
    int a, b;
    if (scanf("%2d%1d", &a, &b) < 2)
        fprintf(stderr, "not enough digits");
    else
        printf("%d, %d", a, b);
}
于 2012-10-07T08:32:36.703 に答える
2

私は間違っているかもしれませんが、%d「数字」ではなく「整数」を意味します。最初55%dも同様で、2 番目の は定義されていません。

%c(1文字)で試すことができます。

于 2012-10-07T08:31:50.583 に答える
1
printf("Enter a two digit number: ");
scanf("%1d%1d", &one, &two);

もちろん、これでも失敗する可能性があります (要件を満たさない)
代わりに:

scanf("%d", &one);
if (one<10 || one>99) printf("I didn't expect that...\n");

また

scanf("%s",oneWord); one = atoi(oneWord);
if (one<10 || one>99)
   printf("Thats not necessarily even a number\n");
else
   { two = one % 10; one = one / 10; 
       printf("The first digit is %d and the second is %d\n",one,two);
   }

後者のプログラムでは、入力が正しいかどうかをテストしています。
正しい入力の代わりにガベージをフィードして、どこが見過ごされているかを確認することをお勧めします。ライブラリ関数 atoi(string); 文字列に含まれる整数を返します。整数が見つからない場合はゼロです。例: (atoi("a1") == 0)。

しかし、最小の正解は

scanf("%d", number);
if (number >= 10 && number <= 99) 
{
   one = number / 10;  // the first digit;
   two = number % 10;  // the second digit calculated as number modulo 10
}

scanf("%1d%d", &one, &two);  // would halt for a single character input
于 2012-10-07T08:32:30.900 に答える