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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

844閲覧

5文字を入力し順列を出力する

KeiD

総合スコア26

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/31 15:35

編集2020/08/01 04:05

以下のように元々
char data[5]="ijklm";
char disp[5]="ijklm";
と並べ替える文字を与えている場合は以下のプログラム

#include <stdio.h> char data[5]="ijklm"; char disp[5]="ijklm"; int flg[5]={0}; void sub(int num) { static int cnt = 0; if (num == 5) { printf("%s ",disp); cnt++; if (cnt % 8 == 0) { printf("\n"); cnt = 0; } return; } for (int i = 0; i < 5; i++) { if (!flg[i]) { flg[i] = 1; disp[num] = data[i]; sub(num + 1); flg[i] = 0; } } } int main() { sub(0); return 0; }

を実行すると

ikljm iklmj ikmjl ikmlj iljkm iljmk ilkjm ilkmj
ilmjk ilmkj imjkl imjlk imkjl imklj imljk imlkj
jiklm jikml jilkm jilmk jimkl jimlk jkilm jkiml
jklim jklmi jkmil jkmli jlikm jlimk jlkim jlkmi
jlmik jlmki jmikl jmilk jmkil jmkli jmlik jmlki
kijlm kijml kiljm kilmj kimjl kimlj kjilm kjiml
kjlim kjlmi kjmil kjmli klijm klimj kljim kljmi
klmij klmji kmijl kmilj kmjil kmjli kmlij kmlji
lijkm lijmk likjm likmj limjk limkj ljikm ljimk
ljkim ljkmi ljmik ljmki lkijm lkimj lkjim lkjmi
lkmij lkmji lmijk lmikj lmjik lmjki lmkij lmkji
mijkl mijlk mikjl miklj miljk milkj mjikl mjilk
mjkil mjkli mjlik mjlki mkijl mkilj mkjil mkjli
mklij mklji mlijk mlikj mljik mljki mlkij mlkji
と15行8列の出力がでるのですが

上記プログラムを下記のように改良し、5文字を入力するようにすると

#include <stdio.h> void sub(int num) { char* data[5]; char* disp[5]; int flg[5]={0}; static int cnt = 0; if (num == 5) { printf("%s ",disp); cnt++; if (cnt % 8 == 0) { printf("\n"); cnt = 0; } return; } for (int i = 0; i < 5; i++) { if (!flg[i]) { flg[i] = 1; disp[num] = data[i]; sub(num + 1); flg[i] = 0; } } } int main(){ char* data[5]; char* disp[5]; scanf("%s %s",&data, &disp); sub(0); return 0; }

ijklmと入力すると空白が出力されて、元からijklmが与えられていたプログラムと同じ出力になりません。
どう直せばよいがご存じの方よろしくお願い致します。

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

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

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

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

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

episteme

2020/07/31 16:31 編集

> ijklmと入力してもエラーがでて いや、そもそもコンパイルエラーで実行すらできんのでは? ひょっとして「あてずっぽでコード書いてエラーが出たら質問」 を繰り返していませんか?
KoichiSugiyama

2020/07/31 18:43

単純なミスだとは思いますが、ソースを記載する場合は実際のソースをコピー&ペーストするのが基本です。あとから手作業で修正すると、思わぬミスが入ってしまいます。また、エラーが出た場合はエラーメッセージもコピー&ペーストする方が、的を射た回答が集まりやすくなります。 あと、epistemeさんもおっしゃっていますが、エラーが出たからといって、あきらめてしまわないで、実現したい内容通りの実装になっているか、デバッガを使って一行ずつ確認する習慣をつけた方が良いと思います。初学者だったらなおさら机上デバッグでは限界があります。デバッガで一行ずつ実行して変数に意図した値が入っているかを確認する方が確実に理解が深まりますし、この規模のプログラムであればそうやった方が質問に対する回答を待つより早く解決することが多いと思います。
KeiD

2020/07/31 20:09

ありがとうございます。 ijklm ijklm と入力すると 空白が出力されてしまいます。
guest

回答2

0

ベストアンサー

こんな感じですかね...

C

1#include <stdio.h> 2 3void sub(int num, int* cnt, int* flg, char* data, char* disp) 4{ 5 if (num == 5) { 6 disp[5] = '\0'; 7 printf("%s ", disp); 8 *cnt += 1; 9 if (*cnt % 8 == 0) { 10 printf("\n"); 11 *cnt = 0; 12 } 13 return; 14 } 15 16 for (int i = 0; i < 5; i++) { 17 if (!flg[i]) { 18 flg[i] = 1; 19 disp[num] = data[i]; 20 sub(num + 1, cnt, flg, data, disp); 21 flg[i] = 0; 22 } 23 } 24} 25 26int main() 27{ 28 char data[6]; 29 scanf("%s", data); 30 31 32 char disp[6]; 33 int flg[5] = { 0 }; 34 int cnt = 0; 35 sub(0, &cnt, flg, data, disp); 36 37 return 0; 38}

text

1入力 2ijklm 3 4出力 5ijklm ijkml ijlkm ijlmk ijmkl ijmlk ikjlm ikjml 6ikljm iklmj ikmjl ikmlj iljkm iljmk ilkjm ilkmj 7ilmjk ilmkj imjkl imjlk imkjl imklj imljk imlkj 8jiklm jikml jilkm jilmk jimkl jimlk jkilm jkiml 9jklim jklmi jkmil jkmli jlikm jlimk jlkim jlkmi 10jlmik jlmki jmikl jmilk jmkil jmkli jmlik jmlki 11kijlm kijml kiljm kilmj kimjl kimlj kjilm kjiml 12kjlim kjlmi kjmil kjmli klijm klimj kljim kljmi 13klmij klmji kmijl kmilj kmjil kmjli kmlij kmlji 14lijkm lijmk likjm likmj limjk limkj ljikm ljimk 15ljkim ljkmi ljmik ljmki lkijm lkimj lkjim lkjmi 16lkmij lkmji lmijk lmikj lmjik lmjki lmkij lmkji 17mijkl mijlk mikjl miklj miljk milkj mjikl mjilk 18mjkil mjkli mjlik mjlki mkijl mkilj mkjil mkjli 19mklij mklji mlijk mlikj mljik mljki mlkij mlkji

投稿2020/07/31 21:46

Penpen7

総合スコア698

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

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

KeiD

2020/08/01 04:04 編集

ありがとうございます。
guest

0

char data[5]="ijklm";

char disp[5]="ijklm";
int flg[5]={0};

となってますが、
5文字の文字列は、6バイト必要です
文字列の終端には'\0'が必要です。

なので、全て配列サイズは6としましょう

char* data[5];

char* disp[5];

なぜポインタの配列なんでしょうか

投稿2020/07/31 21:31

y_waiwai

総合スコア88042

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

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

KeiD

2020/07/31 22:27

ありがとうございます
y_waiwai

2020/07/31 22:33

んで、表面上は問題がないのでスルーしてますが > printf("%s ",disp); 5文字以上入力するとクラッシュするコードになってます
KeiD

2020/07/31 22:40

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問