配列なんですが。
Re:配列なんですが。
>charb[/url][3] = { "1, 3, 5, 7, 9, 11, 13, 15" };
その前に、本当にこのように宣言されていますか?
頭がこんがらがってきたら、1番簡単なところから考えてみると良いですよ。
その前に、本当にこのように宣言されていますか?
頭がこんがらがってきたら、1番簡単なところから考えてみると良いですよ。
char a[3] = { '1', '3', '5' }; char c[3][3] = { {'1', '3', '5'}, {'7', '9', '2'}, {'4', '6', '8'} }; printf( "%c %c %c\n", a[0], a[1], a[2] ); printf( "%c %c %c\n", c[0][0], c[0][1], c[0][2] ); printf( "%c %c %c\n", c[1][0], c[1][1], c[1][2] ); printf( "%c %c %c\n", c[2][0], c[2][1], c[2][2] );
Re:配列なんですが。
> charb[/url][3] = { "1, 3, 5, 7, 9, 11, 13, 15" };
> と記述した場合、何行、何列の2次元配列になりますか?
charとbとの間は空白ですね?
また、初期化子の中にあるダブルクォーテーションは不要ですね?
以上の前提条件の下において、bはchar型の3行3列の配列です。
> また、b[2][2]とした場合には¥0でしょうか?それとも0が入るんでしょうか?
0x00が入ります。
\0が入るのか0が入るのかは、それらの前後に''を付けるつもりだったのか
付けないつもりだったのかがあいまいですので、何とも言えません。
> と記述した場合、何行、何列の2次元配列になりますか?
charとbとの間は空白ですね?
また、初期化子の中にあるダブルクォーテーションは不要ですね?
以上の前提条件の下において、bはchar型の3行3列の配列です。
> また、b[2][2]とした場合には¥0でしょうか?それとも0が入るんでしょうか?
0x00が入ります。
\0が入るのか0が入るのかは、それらの前後に''を付けるつもりだったのか
付けないつもりだったのかがあいまいですので、何とも言えません。
Re:配列なんですが。
え、本にそんな書き方してあるんですか?
だとしたらその本は間違っていると思いますが・・。
コンパイルしたとき
「 'b' : 指定された配列には、初期化子が多すぎます。」
とかエラーが出ませんか?
ご自分でそのコードを書いてコンパイルしてみましたか?
3つしか1まとまりの配列要素を宣言していないのに、8個も代入しようとしているのでエラーになっています。
まず、2次元配列についておさらいしましょう。
よって[/url][3]としているにもかかわらず、8個も1まとまりの中に入れることは出来ません。
だとしたらその本は間違っていると思いますが・・。
コンパイルしたとき
「 'b' : 指定された配列には、初期化子が多すぎます。」
とかエラーが出ませんか?
ご自分でそのコードを書いてコンパイルしてみましたか?
3つしか1まとまりの配列要素を宣言していないのに、8個も代入しようとしているのでエラーになっています。
まず、2次元配列についておさらいしましょう。
int b[2][2]; このように宣言したときは [0][0] [0][1] [1][0] [1][1] このような4つの配列要素が確保できます。 int b[2][3]; このように宣言したときは [0][0] [0][1] [0][2] [1][0] [1][1] [1][2] このような6つの配列要素が確保できます。 int b[4][2]; このように宣言したときは [0][0] [0][1] [1][0] [1][1] [2][0] [2][1] [3][0] [3][1] このような6つの配列要素が確保できます。 つまり int b[x][y]; と宣言した時に、xというまとまりのなかに、y個配列要素があるので、 総計はx*y個になるんですね。 1つのまとまりは括弧で囲んで初期化できます。 int b[3]={1,2,3}; こんな風に初期化できますね。2次元配列でも int b[2][3]={{1,2,3},{4,5,6}}; このように初期化出来ます。 int b[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 2次元配列は2次元であることを意識するために、2次元方向に書いて初期化することもありますが意味は同じです。 int b[5][5]={ {0,3,0,0,0}, {1,1,1,3,1}, {2,2,1,4,1}, {3,1,1,1,1}, {4,1,1,5,1} }; int型は、初期化の時、何もかかなかったら0で初期化 char旗は、初期化の時、何も書かなかったら\0で初期化されます。 int b[5]={}; こうすると全て0で初期化されています。明示的に示すために int b[5]={0,}; と書いてあるものもありますが同じ意味です。しかし int b[5]={1,}; と書いたからといって全て1で初期化されるわけではありません。書かなかったところは0で初期化されます。 また、配列要素数は省略出来ます。 int b[/url]={1,2,3,4,5}; これならb[5]で宣言したのと同じ事。 int b[/url][2]={{1,2},{3,4}}; これならb[2][2]で宣言したのと同じ事上記説明でおわかりになりましたでしょうか?
よって[/url][3]としているにもかかわらず、8個も1まとまりの中に入れることは出来ません。
丁寧な回答をありがとうございます。
>初期化子の中にあるダブルクォーテーションは不要ですね?
すみません。""は不要でした。
本当のプログラムは下記のものです。
#include <stdio.h>
main()
{
int b[/url][3] = { 1, 3, 5, 7, 9, 11, 13, 15 };
これを下記のように
printf(" %d ", b[0][0]);
printf(" %d ", b[0][1]);
printf(" %d ", b[0][2]);
printf(" %d ", b[0][3]);
printf(" %d ", b[0][4]);
printf(" %d ", b[0][5]);
printf(" %d ", b[0][6]);
printf(" %d ", b[0][7]);
printf(" %d\n ", b[0][8]);
と書いて実行したら最後のb[0][8]は、0でした。
その後、機会があって、知人にも確かめてもらいましたが、同じでした。
という事で解決はしたんですが、管理人さんが言うように本当はエラーなんでしょうか?
実行できる私のPCがおかしいんでしょうか?(^^;A)
嘘ではないんですけど…気になりますね。
<!--1
すみません。""は不要でした。
本当のプログラムは下記のものです。
#include <stdio.h>
main()
{
int b[/url][3] = { 1, 3, 5, 7, 9, 11, 13, 15 };
これを下記のように
printf(" %d ", b[0][0]);
printf(" %d ", b[0][1]);
printf(" %d ", b[0][2]);
printf(" %d ", b[0][3]);
printf(" %d ", b[0][4]);
printf(" %d ", b[0][5]);
printf(" %d ", b[0][6]);
printf(" %d ", b[0][7]);
printf(" %d\n ", b[0][8]);
と書いて実行したら最後のb[0][8]は、0でした。
その後、機会があって、知人にも確かめてもらいましたが、同じでした。
という事で解決はしたんですが、管理人さんが言うように本当はエラーなんでしょうか?
実行できる私のPCがおかしいんでしょうか?(^^;A)
嘘ではないんですけど…気になりますね。
<!--1
インプットの制限について質問です。
初めまして。学校でプログラミングを習い始めたばかりの緋闇と申します。
レベル2+くらいです。
入力された2進法の数字を足し算するプログラム作成、という宿題が出ました。
インプットが2進法数字以外ならエラーメッセージを表示するように書いてあるのですが、
どのように入力制限すればいいのかわかりません。
どなたか教えてください。お願いします。
レベル2+くらいです。
入力された2進法の数字を足し算するプログラム作成、という宿題が出ました。
インプットが2進法数字以外ならエラーメッセージを表示するように書いてあるのですが、
どのように入力制限すればいいのかわかりません。
どなたか教えてください。お願いします。
Re:インプットの制限について質問です。
> インプットが2進法数字以外ならエラーメッセージを表示する
入力をいったん文字列として受けます。
その文字列を先頭から1文字ずつチェックし、
2進数を構成する'0'や'1'以外の文字が見つかったら
エラーにすればよいと思います。
入力をいったん文字列として受けます。
その文字列を先頭から1文字ずつチェックし、
2進数を構成する'0'や'1'以外の文字が見つかったら
エラーにすればよいと思います。
Re:インプットの制限について質問です。
> > インプットが2進法数字以外ならエラーメッセージを表示する
>
> 入力をいったん文字列として受けます。
> その文字列を先頭から1文字ずつチェックし、
> 2進数を構成する'0'や'1'以外の文字が見つかったら
> エラーにすればよいと思います。
回答ありがとうございます。
文字列を一文字ずつチェックする、というのはどうしたらいいのでしょうか・・・。
全然わからなくて・・・すみません。
>
> 入力をいったん文字列として受けます。
> その文字列を先頭から1文字ずつチェックし、
> 2進数を構成する'0'や'1'以外の文字が見つかったら
> エラーにすればよいと思います。
回答ありがとうございます。
文字列を一文字ずつチェックする、というのはどうしたらいいのでしょうか・・・。
全然わからなくて・・・すみません。
Re:インプットの制限について質問です。
文字列を1文字づつチェックする方法。
例えば文字列をstrとすると。。
for()文でまわしながら、if()文で
if(str != '0' && str != '1'){
/* 0でも1でもないとここが実行されます */
}
↑こんな感じでしらべてはどうでしょうか?
例えば文字列をstrとすると。。
for()文でまわしながら、if()文で
if(str != '0' && str != '1'){
/* 0でも1でもないとここが実行されます */
}
↑こんな感じでしらべてはどうでしょうか?
Re:インプットの制限について質問です。
どこまで出来ているのかわかりませんが、
入力文字の各桁を切り分けるには、文字数を確認しないといけないですよね。
①~⑤の虫食いを埋めると、文字サイズと切り分けられた文字が表示されます。
※④には同じ文字が入ります。
ソースを掲載する際には以下のようにしてください。
< pre>
ソースをここに記述する
< /pre>
※pre,/preの前の空白は削除してください
入力文字の各桁を切り分けるには、文字数を確認しないといけないですよね。
①~⑤の虫食いを埋めると、文字サイズと切り分けられた文字が表示されます。
※④には同じ文字が入ります。
ソースを掲載する際には以下のようにしてください。
< pre>
ソースをここに記述する
< /pre>
※pre,/preの前の空白は削除してください
#include <①> #include <②> int main( void ) { unsigned char unx[ 256 ]; unsigned int i; fgets( unx, ③( unx ), stdin ); printf( "入力文字の長さは %d\n", ④( unx ) ); for( i = 0; i < ④( unx ); i++ ) printf( "%d番目 %c\n", i + 1, unx[ ⑤ ] ); return 0; }
Re:インプットの制限について質問です。
>↑こんな感じでしらべてはどうでしょうか?
試してみて成功しました。ありがとうございます。
> 入力文字の各桁を切り分けるには、文字数を確認しないといけないですよね。
参考にさせて頂きました。ありがとうございます。
無事に作り終えました。
お答えくださった方々、本当にありがとうございました!
試してみて成功しました。ありがとうございます。
> 入力文字の各桁を切り分けるには、文字数を確認しないといけないですよね。
参考にさせて頂きました。ありがとうございます。
無事に作り終えました。
お答えくださった方々、本当にありがとうございました!