こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

c言語の文字列出力

プログラミング超初心者です
サイトで文字列の出力について調べていたところ
c言語は変数に文字列を代入することができないのでstrcpy関数を使い以下のようにするとあります
char s[5];
strcpy(s, "ABCDE");
printf("%s\n", s);

ところが他のサイトでは以下のように説明しています
char s[5] = "ABCDE";
printf("%s\n", s);

明らかに後者の方が簡単で良いように見えるのですが違いはなんですか?

あと、文字列の配列の指定?の[5]の部分なのですが
数字を記載しているところがほとんどですが省略しているところも有ります
どんな文字列が入るかわからない場合もありますがここは省略しない方が良いのですか?

よろしくお願いします

投稿日時 - 2018-02-12 14:42:25

QNo.9428308

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

前者はstrcpy()の使い方の簡単なサンプルだからかと。
strcpy()の使い方のサンプルなのにstrcpy()が使われていなかったら意味ないでしょ?

>数字を記載しているところがほとんどですが省略しているところも有ります
どんな文字列が入るかわからない場合もありますがここは省略しない方が良いのですか?

>char s[] = "ABCDE";

のように変数定義の段階でABCDEと'\0'で6バイトと明確で、そのバイト数で良い場合には省略できます(末尾の'\0'が不要な場合には省略できません)。
質問での前者のように必要なサイズが不明の場合には省略できません。

投稿日時 - 2018-02-12 17:00:11

補足

よく読んだらcharの配列のところにも同じ説明がありました
strcpy()の説明だったようですね
Googleで検索して出てきたのをそのまま読んでたチェケラッチョですよ!

投稿日時 - 2018-02-12 17:30:27

お礼

strcpy()の使い方の説明ではなく文字列の出力の説明でしたね
あとscanf()などから取り込む場合は何文字入るか解らないけどそういう場合はどうするのですか?

とにかくサンキューチェケラッチョです!

投稿日時 - 2018-02-12 17:20:27

ANo.2

後者はコンパイル時に配列の要素を初期化している。
前者は実行時に代入している。
---
配列の要素数を指定しない場合は自動的に要素数を決めてくれる。

投稿日時 - 2018-02-12 16:00:45

お礼

どっちが効率が良いとかあるのですかね?
自動で決めてくれるのにわざわざ指定する意味がC言語初めて2日の人間には理解できてないんですよね
このような小学生の国語の問題でも不完全でマルが貰えないような解答ではバッテンですね

でもとにかくサンキューチェケラッチョですよ!

投稿日時 - 2018-02-12 17:24:36

ANo.1

まず、質問に書かれているC言語のソースは間違っています。

char s[5];ではなく、char s[6]; にすべきです。6以上で、char s[20];としてもいいですけどね。
このままだと、データ領域外への書き込みが発生します。

>>明らかに後者の方が簡単で良いように見えるのですが違いはなんですか?

やっていることは同じと考えていいと思います。
ソースを簡単に書けるように、後者の書き方も認められるように文法を拡張したのだと思いますね。

>>あと、文字列の配列の指定?の[5]の部分なのですが
数字を記載しているところがほとんどですが省略しているところも有ります

これも同じく、「できるだけ楽にソース書きたい」っていう要望に合わせて、省略もOKな文法に拡張したのだと思います。

投稿日時 - 2018-02-12 14:57:27

お礼

数字を[5]にしたのは無知な私の間違いです\0が入るから6なのですよね
このような間違いを起こさないためにも[]の方が良かったわけですね
サンキューチェケラッチョです!

投稿日時 - 2018-02-12 15:11:46