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

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

ただいまの
回答率

90.51%

  • C

    3707questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 258

Masalu_Kudou

score 12

いつもお世話になっております。
現在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]);
}
}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

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-----

usr~/test/c % ./a.out
testinport
estinport
stinport
tinport
inport
nport
port
ort
rt
t

usr~/test/c % cat ct.c 
#include <stdio.h>

int main(void)
{
  char str[10] = "testinport";

  for (int i= 0; str[i]; i++) {
    printf("%s\n", &str[i]);
  }

  return 0;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/30 12:56

    >char str[10] = "testinport"; は、11文字(終端"\0"のぶん)あります。
    それは、C++ 又は ANSI 以前のCの話です。
    ANSI C では、
    char str[10] = "testinport";
    は最後の '\0' は付加せずに初期化することが出来ます。

    ANSIでは、Cについてはこの改変をしましたが、C++ではこれを適用しませんでした。
    評判が悪かったからですかね(^^;

    キャンセル

  • 2018/06/30 19:45

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

    キャンセル

  • 2018/07/01 08:36 編集

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

    キャンセル

  • 2018/07/01 08:39

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

    キャンセル

  • 2018/07/01 09:14

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

    キャンセル

+2

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

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/30 19:18

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

    キャンセル

  • 2018/07/01 08:58

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/30 19:18

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

    キャンセル

  • 2018/07/01 08:54

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3707questions

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