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

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

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

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

Q&A

解決済

3回答

7330閲覧

文字列sをn回連続して表示する関数について

ssspwp

総合スコア31

C

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

0グッド

0クリップ

投稿2018/04/27 12:41

}```C

文字列sをn回だけ連続して表示する関数
void put_stringn(const char s[], int n)
{

int i;

for (i = 1; i <= n; i++)

{

 for (i = 0; s[i] == '\0'; i++)

{

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

}

}

どこがいけないのかわからないです(-_-;)

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

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

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

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

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

guest

回答3

0

原因(1):
内側のForループの継続条件が間違えている。

質問のコードの内側のforループの部分は、以下のようになっています。

C

1for (i = 0; s[i] == '\0'; i++) 2{ 3   printf("%s", s[i]); 4}

ここで、s[]は文字列、すなわち'\0'を終端とするCharの配列です。
普通、空文字列('\0'だけの配列)を表示しようとはしません(表示する文字がありませんからね)。
だから、s[0]は'\0'ではありません。

そうすると、forループの最初(i=0の時)で、s[0] == '\0' が成り立ちませんから、"printf("%s", s[i]);"が実行されないまま、forループが終わってしまっているのです。(当然、何も表示されません)

文字列('\0'を終端とするCharの配列)を表示したいのであれば、最初から順に1文字ずつ表示していくというのを'\0'が現れるまで続ければ良いですよね。
そうすると、forループを続ける条件は、s[i] == '\0'ではなく、s[i] != '\0'にしないといけないという事に気づくはずです。

また、1文字表示するのですから、printfのフォーマットは、"%s"ではなく"%c"です。
コードを修正すると、

C

1for (i = 0; s[i] != '\0'; i++) 2{ 3   printf("%c", s[i]); 4}

これが、文字列を一回表示するコードです。 
( 上記コードを「printf("%s",s);」と一行で済ませることもできますが、それではプログラムの練習にならないですよね)

原因(2):
2つのforループで、iがループ変数として使われている。

 質問のコードには二重になったforループがありますが、どちらのforループもループ変数としてiを使っているのは問題です。
内側のforループは、上で説明したように i=0でループが終わります。外側のforループで、i++ とiを増やしても、内側のforループで i=0に戻ってしまいますから、外側のforループは終わることがありません。(質問のコードを実行したら、いつまで経っても終わらないです)

 この問題は、forループごとに、違うループ変数を使うことで解決できます。

以上の修正をすると、コードは以下のようになります。

/* 文字列sをn回だけ連続して表示する関数 */ void put_stringn(const char s[], int n) { int i; // 外側のforループのループ変数 int j; // 内側のforループのループ変数 (追加しました) for (i = 1; i <= n; i++) {  for (j = 0; s[j] != '\0'; j++) // jをループ関数として使います {    printf("%c", s[j]); } }

投稿2018/04/27 13:30

coco_bauer

総合スコア6915

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

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

0

ベストアンサー

なぜ二重ループにしてるんです?

C

1for(int i = 0; i < n; ++i) { 2 printf("%s\n", s); 3}

逆に二重ループを使いたいなら、ループカウンタは分けないといけません。

C

1for(int i = 0; i < n; ++i) { 2 for(int j = 0; str[j] != '\0'; ++j) { 3 printf("%c", str[j]); 4 } 5 printf("\n"); 6}

それ以外にもおかしな点を修正しています。

  • 内側のループの継続条件
  • 出力する際の書式指定子

投稿2018/04/27 12:44

編集2018/04/27 12:49
LouiS0616

総合スコア35660

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

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

ssspwp

2018/04/27 13:13

詳しい説明ありがとうございます!
guest

0

一応、

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

文字列を出力しようとしていますが、 ("%s")
s[i] は、文字です。 (違いが分かりますか?)

投稿2018/04/27 12:55

pepperleaf

総合スコア6383

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

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

ssspwp

2018/04/27 13:13

素早い回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問