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

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

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

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

Q&A

解決済

3回答

127閲覧

C言語で文字列の扱いについて

Masalu_Kudou

総合スコア91

C

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

0グッド

0クリップ

投稿2018/06/29 18:26

いつもお世話になっております。
現在C言語を学習しているものです。
C言語では文字列型は配列を使用して変数に格納すると学習書に書いてあったので自身でテストをおこなっておりましたがなかなかうまくいかず、???状態なのでご協力いただければ幸いです。
まず、自身の理解ではchar[xxx]で文字列を入れる分だけメモリを用意し、その配列の1つにつき1つずつ文字が入るのかなという考えのもと、下記テストソースを作成しました。

#include <stdio.h>

int main(void){
int i = 0;

char str[10] = "testinport"; for(;i<= sizeof(str) /sizeof(str[0]);i++){ printf("%s" ,str[i]); }

}

しかしコンパイルは成功したものの、実行すると何も表示されません。同じ文字が出力されるかなと思っていたので戸惑っております。どなたかアドバイスをお願いいたします。

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

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

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

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

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

guest

回答3

0

すでに回答は書かれているので割愛しますが、まず C 言語には「文字列」はありません。
「任意のアドレスから、null 文字(\0)が見つかるまでの連続したメモリ空間」を、文字列のように扱っているだけです。

printf の %s 指定とは、「指定したアドレスから、\0が出てくるまでのメモリ内容を出力する」です。

C

1printf("%s", str[i])

は、str[i] からの何バイトかをアドレスと見なして(どういう風にアドレスとみるかは実際の動作環境に依存します)、そのアドレスから \0 が出るまでを出力することになってしまいます。

投稿2018/06/30 04:02

tacsheaven

総合スコア13703

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

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

gingertail

2018/06/30 10:18

無いのは文字列型ではないでしょうか? 文字列(リテラル)はあります
Masalu_Kudou

2018/06/30 23:58

printfで%s指定をするとそういう意味があったのですね!!どおりでstr[i]を出力指示を出しても何も表示されなかったわけです。ありがとうございました!
guest

0

ベストアンサー

char str[10] = "testinport"; は、11文字(終端"\0"のぶん)あります。
なので、char str[11] = "testinport";とするかchar str[] = "testinport";としてください。
また、printf("%s" ,str[i]);はprintf("%s" ,&str[i]);としないと表示できません。
for(;i<= sizeof(str) /sizeof(str[0]);i++){は、for(;str[i];i++){でもいけますd^^

・・・理由は考えて・・・頑張って下さいv
[追加]
----->8----->8----->8----->8----->8-----

c

1usr~/test/c % ./a.out 2testinport 3estinport 4stinport 5tinport 6inport 7nport 8port 9ort 10rt 11t 12 13usr~/test/c % cat ct.c 14#include <stdio.h> 15 16int main(void) 17{ 18 char str[10] = "testinport"; 19 20 for (int i= 0; str[i]; i++) { 21 printf("%s\n", &str[i]); 22 } 23 24 return 0; 25}

投稿2018/06/29 20:30

編集2018/06/30 10:23
cateye

総合スコア6851

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

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

PingHermit

2018/06/30 03:56

>char str[10] = "testinport"; は、11文字(終端"\0"のぶん)あります。 それは、C++ 又は ANSI 以前のCの話です。 ANSI C では、 char str[10] = "testinport"; は最後の '\0' は付加せずに初期化することが出来ます。 ANSIでは、Cについてはこの改変をしましたが、C++ではこれを適用しませんでした。 評判が悪かったからですかね(^^;
cateye

2018/06/30 10:45

了解d^^ が、「文字列型は配列を使用して変数に格納する」とおっしゃっているので'\0'終端でなければおかしいのと思いますが?また、printf("%s" ,str[i]);は間違いこそあれ文字列を出力しているように見えます。 なので、一応終端のない状態でコンパイル(clang version 5.0)してみた結果が追加部分です。アセンブラソースを確認したほうがいいとは思いますが、・・・たまたま動いているだけのように思います・・・gccだとまた違うかも? いずれにしても、“文字列”として出力したいのか? ‘文字’として出力したいのかがわからないのでなんとも言えませんが・・・sizeof(str) /sizeof(str[0])は文字出力にも見えなくない・・・
Masalu_Kudou

2018/06/30 23:37 編集

大変勉強になりました。strで受け取ってcharで出力……と目から鱗でした。ちなみにchar str[10]だと0から10の計11個の配列ができるかと思っていたのですがそれでは足りなかったということでしょうか?
pepperleaf

2018/06/30 23:39

char str[10] は、str[0] .. str[9] までの 10個!の配列です。 ただし、 C言語はこの辺のチェックが緩いので、間違えると実行時エラーとなる可能性が高いです。
Masalu_Kudou

2018/07/01 00:14

なるほど!0~9だったのか……。すごい初歩的な勘違いをしてました。 丁寧なご回答ありがとうございます!
guest

0

printf("%s" ,str[i]);

まず、ここが NGです。 どこか分からない場所のデータを出力しようとしています。
str[i] は、文字(char)。 これに対し、 "%s" は、文字列("char *" または、char[])が引数である事を期待してます。
一文字ずつならば、 "%c"
ただし、一文字ずつしか出力しないので、改行コードを付けて、"%c\n" とすれば、一行に一文字となります。(この辺のオプションは調べてください)

投稿2018/06/29 22:40

pepperleaf

総合スコア6383

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

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

gingertail

2018/06/30 10:18

「まず」ではなくそこだけがNGですね +1
Masalu_Kudou

2018/06/30 23:54

ありがとうございます!すぐにテストしてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問