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

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

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

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

Q&A

解決済

2回答

1195閲覧

各文字をn回ずつコピーする文字列の出力

ni-kura

総合スコア3

C

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

0グッド

0クリップ

投稿2023/01/16 02:54

前提

理系単科大学でプログラミングを勉強しています。
現在C言語を使っていて、教科書の演習問題でわからないところがあったので質問します。

実現したいこと

整数 n を渡して各文字が n 回ずつコ
ピーされるようにする。
例n = 2の場合
% ./a.out
aabbccddee

発生している問題・エラーメッセージ

エラーは出ないんですけど、出力がされません。

エラーメッセージ

該当のソースコード

#include <stdio.h>
void printdup(char s[], int n) {
char buf[100];
int i, j, x = 0;
for(i = 0; s[i] != '\0'; ++i) {while(x <= n){buf[j++] = s[i]; x = x + 1;}}
buf[j] = '\0'; printf("%s\n", buf);
}
int main(void) {
char str[] = "abcde";
int n;
printf("n>"); scanf("%d", &n);
printdup(str, n);
return 0;
}

ソースコード

試したこと

補足情報(FW/ツールのバージョンなど

出力は以下の通りですね
$ ./a.out
n>3

文字列の出力はされてないようです

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

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

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

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

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

jimbe

2023/01/16 04:44

コードはコードのマークダウンを利用してください。(ソースコードと書かれている中等) 一部の記号がフォーマットに利用されたりして見えなくなる場合があります。
guest

回答2

0

方法1

Instructions

1S := 与えられた文字列 2N := Sの長さ 3M := 繰り返し回数

C

1for (i=0; i<N*M, i++) printf("%c", S[i/M]);

方法2

Text_feat._ChatGPT

1(意訳, 抜粋) 2 3ChatGPT: 4ご提示のコードにおいて、while文の終了後にxの値が初期化されていないことが、バグの原因です。 5while文を抜けたら、x = 0としましょう。 6for(i = 0; s[i] != '\0'; ++i) {while(x <= n){buf[j++] = s[i]; x = x + 1;}} 78for(i = 0; s[i] != '\0'; ++i) {while(x <= n){buf[j++] = s[i]; x = x + 1;}x=0;} 9に変更する。 10 11TheCubWorld: しかし、それでは、各文字がn+1回繰り返されます。 12 13ChatGPT: ご指摘の通りです。while(x <= n)をwhile(x < n)とすると、このバグは修正できます。 14

C

1for(i = 0; s[i] != '\0'; ++i) {while(x < n){buf[j++] = s[i]; x = x + 1;}x=0;}

投稿2023/01/16 03:05

編集2023/01/16 03:17
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

j0 で初期化しましょう。

動作がおかしいなと思ったら、まずはデバッガで変数の値を確認しながらステップ実行してみるとよいです。

投稿2023/01/16 02:56

編集2023/01/16 02:58
int32_t

総合スコア20845

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

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

ni-kura

2023/01/16 03:01

x = 1; j = 0;と初期化したら出力はされたんですけど、 n>3 aaa のようになってb以降が出力されないです
int32_t

2023/01/16 03:03

xをforループの中whileの前で初期化しましょう。
ni-kura

2023/01/16 03:10

正しく出力されて解決しました。ありがとうございます。
jimbe

2023/01/16 17:44

内側のループはなぜ for にしなかったのでしょう。 for(i = 0; s[i] != '\0'; ++i) for(j = 0; j < n; ++j) buf[x++] = s[i];
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問