プロが教えるわが家の防犯対策術!

初めて投稿します。
C言語の数値入力についてお聞きします。
以下のようなプログラムで、
1
1 2
と入力し、配列t[i]、s[i]にそれぞれ、「1、2」に代入され、printfで「1、2」と出力されるか確認したところ、「2、2」と出力されました。配列t[i]、s[i]に「1、2」を代入するには、どうすればよいか、分かる方がいましたら、ぜひ教えて下さい。
#include <stdio.h>

int main()

{
//変数の宣言と初期化
int i=0,n=0, sum = 0, avg = 0;
//個分のint型配列を用意
scanf("%d",&n);
int t[n],s[i];
//nに0を代入、nが20になるまで、nに1を足す
for(i=0; i<n ;i++)
{
scanf("%d",&t[i]);
fflush(stdin);
scanf("%d",&s[i]);
sum = sum + t[i];
}
for(i=0; i<n ;i++)
{
printf("%d %d\n",t[i],s[i]);
}
return 0;
}

A 回答 (2件)

>int i=0,n=0, sum = 0, avg = 0;


>scanf("%d",&n);
>int t[n],s[i];

s[]は0でしか作成していませんけど?
# int s[0]だとどうなるんだっけ?
# http://colorful-pico.hatenablog.jp/entry/2014112 …
# 可変長配列…らしいが……malloc()とかで動的確保したわけではないしねぇ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
int t[n],s[i]ではなく、int t[n],s[n]の間違いでした。
修正したところ、無事予想通りの出力結果になりました。

お礼日時:2016/08/20 08:54

手元には C99 の規格しかないのでそこから (うぅん, そろそろ C11 の規格も入手しとこうかなぁ).



一般論として「大きさ 0 の配列」を作ることはできません>#1. 規格上規定している場所は違いますが, 大きさを整定数で指定する場合でも (定数でない) 整数式で指定する場合でも, いずれにおいても「値は 0 より大きくなければならない」 (shall have a value greater than 0) とされています. そして, 今の場合その規定に反しているので (「shall」に反していることから) プログラムは ill-formed であり, 従って undefined behavior となります. ちなみに #1 のリンクに書いてあることは (規格上は) 大間違いです. ひょっとすると GCC の拡張機能を「C99 の機能」と勘違いしているのかもしれません.

あとついでに書いておくと, stdin に対して fflush を呼び出すのは一般にはアウトです. これも「できる処理系もある」というのは知ってるけど, 規格上はやってはいけません.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
int t[n],s[i]をint t[n],s[n]に修正したところ、問題が解決しました。

お礼日時:2016/08/20 08:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!