質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

6回答

2485閲覧

文字列リテラルを収納する変数を、配列変数にまとめる方法について

wilddown

総合スコア34

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1グッド

1クリップ

投稿2016/06/18 10:06

編集2016/06/18 22:21

文字列リテラルを収納する変数を、配列変数でまとめる場合はどうすればいいのでしょうか?
例えば、str[27]という配列変数を定義し、添え字0にはa、1にはb、2にはc といったように文字列リテラルを配列変数に収納して、

C

1for(int n;n<27;n++){ 2printf("%s"str[n]); 3}

というふうにしたら、a~zが順番に表示されるようにしたいのです。
文字列リテラルをただ変数に収納するだけならば、char str[10] などという風にすればいいだけなのですが、
配列変数で定義する(?)となるとよくわかりません。(てかもともとが配列変数?)
教えていただけないでしょうか?

追記
cateyeさん>>二度も同じ間違いをしていまい本当にすみません。お恥ずかしいばかりです。以後気を付けます。

みなさんご回答ありがとうございました。何人かの方がおっしゃられているように、かなり初歩的で意味不明な質問だったようで、本当にすみません。課題の見直しをして、次に生かしたいと思います。
付き合っていただいた皆様、本当にありがとうございました。

mpyw👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2016/06/18 14:14 編集

文字列を格納した配列を作りたいのでしょうか? たとえば、str[0] <- "a", str[1] <-"b",str[2]<-"c"・・・という事でしたらcharの2次元配列にすればOKです。・・・以前も言いましたがリテラルは定数です。変数ではありません。なので「文字列リテラルを収納する変数」ではなく「文字列を収納(あるいは格納)する変数」です。
guest

回答6

0

そもそも「文字列リテラル」に制限する必要性がわからないです。これは文字列(文字の配列)とは異なります。これはプログラム上に変更不可の値として埋め込まれた定数です。ですので、題意を厳密に満たすならば、"a", "b", "c"・・・といった式が必要です。そうなると

const char* str[] = {"a", "b", "c"・・・"z"};とか愚直な列挙しか方法はないと思います。

一文字+終端記号の文字列なのですから都度都度計算して作ることも難しくないですし、課題の見直しをしたほうがいいと思います。

投稿2016/06/18 15:13

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

「『リテラルを指すアドレス』の配列」として作る場合

c

1#include <stdio.h> 2 3int main(void) 4{ 5 /* リテラルは書き換えてはいけないので,charに対してのconst宣言は必須 (外側の配列サイズは省略可能) */ 6 const char *strings[] = {"aaa", "bbb", "ccc"}; 7 strings[1] = "BBB"; // 「リテラルを指すアドレス」を上書きすることはできる 8 // strings[0][0] = 'A'; // 「リテラル」を上書きすることはできない 9 for (int i = 0; i < sizeof(strings) / sizeof(char *); ++i) { 10 printf("%s\n", strings[i]); 11 } 12 return 0; 13}

「『255文字まで格納できる文字の配列』の配列」として作る場合

c

1#include <stdio.h> 2#include <strings.h> 3 4int main(void) 5{ 6 /* 文字の配列はconst宣言しない限りは書き換え可能 (外側の配列サイズは省略可能) */ 7 char strings[][256] = {"aaa", "bbb", "ccc"}; 8 strcpy(strings[1], "BBB"); // 「文字の配列」をstrcpyを用いて1文字ずつ上書きすることはできる 9 // strings[1] = "BBB"; // 「文字の配列」が入るべき場所に「リテラルを指すアドレス」を入れることはできない 10 strings[0][0] = 'A'; // 「文字の配列」の一部をstrcpyを使わずに手動で直接上書きすることはできる 11 for (int i = 0; i < sizeof(strings) / sizeof(strings[0]); ++i) { 12 printf("%s\n", strings[i]); 13 } 14 return 0; 15}

補足

以下の2つはどちらも全く同じ意味の「文字の配列」です.

c

1char a[] = {'a', 'b', 'c', '\0'}; 2char a[] = "abc";

以下は「リテラルを指すアドレス」(ポインタ)です.

c

1char *a = "abc"; 2// char *a = {'a', 'b', 'c', '\0'}; // この書き方はできない

投稿2016/06/18 10:27

編集2016/06/18 11:19
mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

BAが出てしまっているので余計なことかもしれませんが・・・リテラルについて
int a;という宣言があって、a= 3;という式があるとき
aは変数で3はリテラル(ソースコード内に値を直接表記したもの)です。
リテラルは左辺値にはなりえません・・・これは3= a;と書けないという事です。

すでに学習済なら読み飛ばして結構です。
左辺値については左辺値の意味がいまいちわかりませんで確認してみてください。

投稿2016/06/20 11:47

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

a.c

c

1#include <stdio.h> 2 3int main(void) { 4 char * str[] = { 5 "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", 6 "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" 7 }; 8 9 for (int n = 0; n < 26; n++) { 10 printf("%s", str[n]); 11 } 12 printf("\n"); 13 14 char * str_a = "ABC"; 15 char * str_b = "XYZ"; 16 char * str2[] = { 17 str_a, str_b 18 }; 19 for (int n; n < 2; n++) { 20 printf("%s", str2[n]); 21 } 22 printf("\n"); 23}

実行結果

$ gcc a.c $ ./a.out abcdefghijklmnopqrstuvwxyz ABCXYZ

投稿2016/06/18 16:09

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wilddown

2016/06/18 22:19

よくわかりました。ありがとうございました。 かなり初歩的で意味不明な質問だったようでとても恥ずかしいです。 詳しく説明していただき、本当にありがとうございました。
guest

0

C

1char str[26][2]; 2for(int i=0;i<26;i++){ 3 sprintf(str[i],"%c", 'a'+i); 4}

これで作れないですかね。動作は試してませんが

投稿2016/06/18 11:06

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

char str[]="abcdefghijklmnopqrstuvwxyz";でできます。

投稿2016/06/18 10:08

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wilddown

2016/06/18 10:18 編集

そういう風に全部まとめて一つのリテラルとして保存するのではなく、一つ一つ収納できるようにしたいのです。上であげた例ではそれで大丈夫なのですが、ほかにそれではだめな部分もあるので。
Chironian

2016/06/18 12:07

> 上であげた例ではそれで大丈夫なのですが、ほかにそれではだめな部分もあるので。 う~ん、もしかして、"%s"で表示できることが重要なのでしょうか? その場合は、下記でどうでしょう? char const* str[]={"a", "b", "c", ..., "z", ""};
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問