"asrutocdgeqkfg"という文字列をアルファベット順に並び替えたいのですが下記のプログラムだとうまくいきません。よろしければアドバイスをよろしくお願いします。
#include<stdio.h>
#define N 15
int main()
{
int i,j,k;
char ch[N] = "asrutocdgeqkfg";
char ex;
for (i = 0; i < N - 1; i++)
for (j = 0; j < N - 1; j++)
if (ch[j] > ch[j + 1])
{
ex = ch[j];
ch[j] = ch[j + 1];
ch[j + 1] = ex;
}
for (k = 0; k < N; k++)
{
printf("%s", ch[k]);
}
return 0;
}
文字列のアルファベット順並び替え
Re: 文字列のアルファベット順並び替え
まず、ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
次に、「うまくいきません」だとわかりにくいです。
具体的に「どうなってほしいのに」「現状どうなってしまう」のかが書かれているとわかりやすそうです。
そして、printfでchar*型のデータを要求する書式%sにchar型のデータを渡しているので、未定義動作になります。
1文字出力するには書式%cを用いるといいでしょう。
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
次に、「うまくいきません」だとわかりにくいです。
具体的に「どうなってほしいのに」「現状どうなってしまう」のかが書かれているとわかりやすそうです。
そして、printfでchar*型のデータを要求する書式%sにchar型のデータを渡しているので、未定義動作になります。
1文字出力するには書式%cを用いるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 文字列のアルファベット順並び替え
ループの中で、i がからむ処理がないのが気になります。
・i がからむ処理をしたければ、そういうコードを書く
・処理がなくていいのなら、i のループをやめる
どっちかにしましょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 文字列のアルファベット順並び替え
iに依存して処理内容を変えることなく、単にN - 1回ループ処理を実行しているのですね。box さんが書きました:ループの中で、i がからむ処理がないのが気になります。
・i がからむ処理をしたければ、そういうコードを書く
・処理がなくていいのなら、i のループをやめる
どっちかにしましょう。
あえて「i のループをやめる」なら、変数名をcountなどにするといいかもしれませんね。
もちろん、この程度の入力では考えることが増える割にあまり性能向上の意味は無いでしょうが、よくあるようにiに依存してどこまで見るかを決めてもいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 文字列のアルファベット順並び替え
"asrutocdgeqkfg" という文字列は、最後に終端文字 '\0' がTKD さんが書きました:"asrutocdgeqkfg"という文字列をアルファベット順に並び替えたいのですが下記のプログラムだとうまくいきません
あるので、ch のサイズは 15バイトですが、並び替えるのは
'a' から 'g' までの 14文字であることに注意してください。