2016-04-17 5 views
0
int sales[ 1 ]; 
do 
{ 
    scanf_s("%d", sales, 1); 

    printf("\n%d\n", sales[ 0 ]); 

    printf("\nyou got weekly income of $ %d\n\n", commision(sales[ 0 ])); 

} while (sales[0] >-1); 

と突然、別のint型出力容量とI入力INT(たとえば123 456)たびに、出力が販売され、なぜ私は、お願いしたいと思います[0] = 123、突然、それは自動的に売上に456を割り当てる[0 ]、 あなたはそれをなぜ説明できますか?スペース

答えて

1

コードの機能は、標準入力から符号付き数値を読み込むことです。 (%dは空白文字まで読み込みますが、空白は無視されます)。のインデックス0にその番号(最初の数字は123)が書き込まれます。次に、commision(...)関数の戻り値を標準出力に書き出します。

、突然それが自動的に販売に456を割り当てる[0]

ことによって、あなたは、プログラムの実行の終了時にsales[0]が全体の手順は、私が説明したので、それはある456代わり123の含まれていることを意味している場合あなたのdo whileループが実行されている限り、上記は実行されます。そして、sales [0]が-1より大きい場合、sales[0]が最初の手順の後に123である場合、それは再び実行され、456を標準入力から読み取り、sales配列に書き込みます。

stdinからscanf_s("%d", int_pointer, 1)読み取る入力するためのいくつかのその他の例:

  • 入力42 43ab 44424344として3つの異なるscanf_sで読み出されることになります。
  • 入力42 aは、scanf_s420と2つの異なる形で読み取られます。
  • 入力42 a a43 444200及び44ように4つの異なるscanf_sで読み出されることになります。
+0

私は参照していますが、ルールがchar型に適用されないのはなぜですか(例i入力ab [空白] d出力のみの販売= "ab"および[空白]の後の文字列は削除されましたか? と1私はまだ混乱して、コンパイラはどこに456を格納したのですか?最初に彼は123をsales [0]に割り当て、格納する変数は456になりません....最初のループが終了した後、 scanf文)、なぜscanfが突然456を取得するのですか?どこから来たのですか?私がworngなら正しいです –

+0

"char型の適用"とはどういう意味ですか?あなたが 'scanf_s("%d "、sales、1)を実行している場合、' scanf_s'は引き続き入力を符号付き整数として解釈します。入力が解析され、有効な符号付き整数を形成する入力のすべての文字は、変数(ここでは 'sales')に"入れ "られます - すべての末尾のものは無視されます(' 42ab' = 42 '。上記の例のように、' sales'の型が 'char'型の場合、読み込まれる整数は32(大部分の' int's)または64ビットの代わりに8ビットです。 – mxscho

+0

コンパイラはここで何もしません。プログラムの実行時に実行されます。 'do while'の' scanf_s'の2回目の実行では 'sales [0]'の値が*に置き換えられますので、 '123'は' 456'に置き換えられます。 – mxscho

0
int commission(int i) { 
    return 42*i; 
} 

int main(int argc, const char * argv[]) { 
    int sales[ 1 ]; 
    do 
    { 
     scanf_s("%d", sales, 1); 

     printf("\n%d\n", sales[ 0 ]); 

     printf("\nyou got weekly income of $ %d\n\n", commission(sales[ 0 ])); 
     sales[0] = -1; // Won't jump to the next value 
    } while (sales[0] >-1); // But then what's the point of the loop? 

    return 0; 
} 
+0

これはどのようにして質問に答えますか?あるいは、別の質問をここで聞こうとしていますか、フィリップ? – Pang

1

scanf関数はうるさいです、それは1つの数の正確な入力を望んでいるからです。これには、空白が必要な入力形式の終わりを知らせます。

123 [空白] - > 123が割り当てられ、何かが発生して再びループします。

456 [空白] - > 456が割り当てられ、何かが起こり、再びループします。