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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

3回答

1441閲覧

文字列の並び替えを行うプログラムの作成で出力結果が表示されません

mememe0331

総合スコア55

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2020/06/27 02:45

編集2020/06/29 16:33

前提・実現したいこと

2つの文字列を入力して、交互に表示する文字列を作成するプログラムを作りたいです。

例えば、
str1:abcd
str2:xy
str3:axbycd
のようになります。

このプログラムを作成して、
「コンパイルは通るのですが、結果が出力されない。」
という問題が発生しました。

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

コンパイルしても、結果が出力されません。

該当のソースコード

#include <stdio.h> #define NUMBER 100 void strMix(char *str1,char *str2, char *str3); int main(void) { char str1[NUMBER]; char str2[NUMBER]; char str3[NUMBER]; printf("入力:"); scanf("%s %s\n",str1,str2); strMix(str1,str2,str3); printf("出力:"); printf("%s\n",str3); return 0; } void strMix(char *str1,char *str2, char *str3) { int i=0; while(str1++||str2++){ if(i%2==0){ *(str3+i)=*(str1++); } if(i%2!=0){ *(str3+i)=*(str2++); } i++; } if(str1+i!=0){ while(str1+i){ *(str3+i)=*(str1+i); i++; } } if(str2+i!=0){ while(str2+i){ *(str3+i)=*(str2+i); i++; } } }

試したこと

関数内の条件を
void strMix(char *str1,char *str2, char *str3)
{
int i=0;

while(*str1!='\0' && *str2!='\0'){ if(i%2==0){ *str3++ = *str1++; } else { *str3++ = *str2++; } i++; } while(*str1!='\0'){ *str3++ = *str1++; } while(*str2!='\0'){ *str3++ = *str2++; }

}
に変更してみたのですが、出力がおかしくなってしましました。
自分ではこれ以上、どこを直せば良いのか分かりません。

実行結果
出力:axbycd・

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

サクラエディタ、コマンドプロンプト for VS 2019を使用しています。

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

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

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

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

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

kazuma-s

2020/06/29 16:38

試したことのコードも ```C と ``` を前後につけてください。 表示が変なのはわかるでしょう。 文字列の終端は '\0' です。str3 の最後にもつけてください。
mememe0331

2020/06/29 16:46

最後にヌル文字を入力することで出来ました! 何回も丁寧にご回答くださってありがとうございます! とても助かりました。遅くまで本当にありがとうございます。
guest

回答3

0

VisualStudioを使ってるならデバッグしましょう。
ブレークポイントを設定すればそこでコードの実行を止めることができ、その時点の変数の中身を見ることができます。
また、そこから1行づつ実行させ、変数の変化を見ることができます。

これであなたのコードのデバッグを行っていきましょう。

投稿2020/06/27 02:51

y_waiwai

総合スコア87749

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

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

mememe0331

2020/06/29 14:55

y_waiwai様、 ご回答ありがとうございます。 知らなかったです。試してみます!教えて頂いてありがとうございます。
guest

0

ベストアンサー

strMix の中の str1、str2、str3 はポインタで、
main の中の配列の要素を指しています。
++ しようが、+i しようがポインタの値が 0 になることはありません。
文字列の終端の '\0' を検出したいのでしょうから、
str++ とか、(str+i) すなわち str[i] を見ないといけないでしょう。

追記
試したことのコードでは、str++ と i++ を同時に実行しているため、
*(str1+i) が変な文字を指すことになっています。

C

1#include <stdio.h> 2 3#define NUMBER 100 4 5void strMix(char *str1,char *str2, char *str3); 6 7int main(void) 8{ 9 char str1[NUMBER]; 10 char str2[NUMBER]; 11 char str3[NUMBER]; 12 13 printf("入力:"); 14 scanf("%s %s", str1, str2); // ★ scanf の書式の最後に \n をつけない 15 16 strMix(str1, str2, str3); 17 18 printf("出力:"); 19 printf("%s\n", str3); 20 21 return 0; 22} 23 24void strMix(char *str1, char *str2, char *str3) 25{ 26 int i = 0; 27 28 while (*str1 != '\0' && *str2 != '\0') { 29 if (i % 2 == 0) { 30 *str3++ = *str1++; 31 } 32 else { // ★ if (i % 2 != 0) は無駄 33 *str3++ = *str2++; 34 } 35 i++; 36 } 37 38 while (*str1 != '\0') { 39 *str3++ = *str1++; 40 } 41 while (*str2 != '\0') { 42 *str3++ = *str2++; 43 } 44 *str3 = '\0'; 45}

投稿2020/06/27 03:52

編集2020/06/29 16:15
kazuma-s

総合スコア8224

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

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

mememe0331

2020/06/29 14:59

kazuma-様、 ご回答ありがとうございます。 具体的なご指摘ありがとうございます。とても助かります!参考にして試してみます。 ありがとうございます!
kazuma-s

2020/06/29 15:02

参考にして試してみたコードを質問に追記してください。
mememe0331

2020/06/29 15:22

追記致しました。コメントありがとうございます!
mememe0331

2020/06/29 16:37

追記ありがとうございます! kazuma-s様のお陰で質問最初に比べて理解が深まりました! しかし、最後に余分な文字が表示されてしまいます。 どうして一回多く表示されてしまうのでしょうか? お忙しいところ恐縮ですが、ご回答頂けると幸いです。
guest

0

何をしたらいいのか分かりませんでした。

・デバッガーを使って、1ステップずつ実行する
・適所にprintfを入れて変数の値が自分の期待通りか確認する
・プログラムのロジックを自分で追いかける(人間デバッガ)

のいずれかです。

なんか、無駄に複雑にしている気がしますので、全部消して、シンプルに書き直すのも手です。

投稿2020/06/27 03:28

otn

総合スコア84503

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

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

mememe0331

2020/06/29 14:58

otn様、 ご回答ありがとうございます。 試してみます!教えてくださってありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問