ページ 11

文字配列について

Posted: 2011年1月11日(火) 05:52
by beginner
アルファベットの文字列を入力して関数に渡し辞書の並び順に並びかえて結果を表示するというプログラムをつくっているのですが、20行目に error C2664: 'strcmp' : 1 番目の引数を 'char' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 整数型からポインター型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。というエラーがでてきました。
どのように対処すれば良いか分からないのでそこのところをよろしくお願いします。

コード:

#include<stdio.h>
#include<string.h>
int main(void) {
	int i,n;
	char a[101];
	char alpha(char []);
	printf("アルファベットの文字列を入力してください\n");
	scanf("%s",a);
	n=strlen(a);
	printf("アルファベット順に並び替えます\n");
	for(i=0;i<n;++i)
	printf("%c",alpha(a));
}
char alpha(char a[]) {
	int i,min,n,j;
	n=strlen(a);
	for(i=0;i<n;++i) {
		min=i;
		for(j=i+1;j<=n;++j)
		    if(strcmp(a[min],a[i])>0) min=j;
	}
	return min;
}

Re: 文字配列について

Posted: 2011年1月11日(火) 07:58
by h2so5
strcmp は文字列の比較をする関数であって、文字同士の比較はできません。

文字同士の比較は、単純に a[min]==a で表せます。

Re: 文字配列について

Posted: 2011年1月11日(火) 16:14
by beginner
>>h2so5さん
お返事ありがとうございます。
コンパイルして表示させるときに文字化けをするのですがどのようにすればよいですか。

Re: 文字配列について

Posted: 2011年1月11日(火) 16:55
by さかまき
alpha の返値minがアルファベットのコード領域では無いから
化けるのだと思います。
関数alphaは何をしてますか?

Re: 文字配列について

Posted: 2011年1月11日(火) 17:54
by h2so5
どの文字が化けるのですか?
日本語の部分か、それとも並べ替えたアルファベットですか?

Re: 文字配列について

Posted: 2011年1月11日(火) 17:58
by beginner
>>さかまきさん
関数alphaはmainで入力された文字列を辞書的な順序に並びかえるという役割をしていると思うのですが、
間違っていたら指摘のほうをお願いします。

>>h2so5さん
並びかえた後のアルファベットが化けてしまいます。

Re: 文字配列について

Posted: 2011年1月11日(火) 18:00
by h2so5
いま気づいたのですが、
関数alphaは並び替えた文字列ではなく1文字だけを返していますよ。

追記;
それに、返しているminという変数は文字コードではなく、カウントの数値のようです。

さらに追記;
関数alphaは何度実行しても同じ結果を返すと思います。
呼ばれた回数を保持していませんので。
[hr]
関数alpha内で何がしたいのかよく分からないので、
ちゃんと動くようにalphaを書き直してみました。

コード:

char alpha(char a[]) {
    int i,n,min = 0;
    char res,min_char = 'z';
    n=strlen(a);
    for(i=0;i<n;++i) {
		if(min_char > a[i]){ 
			min = i;
			min_char = a[i];
		}
    }
    res = a[min];
    a[min] = 'z';
    return res;
}
何か質問があればどうぞ。

Re: 文字配列について

Posted: 2011年1月11日(火) 23:53
by beginner
>>h2so5さん
11行目と12行目のコードがわからないので説明の方をお願いします。

Re: 文字配列について

Posted: 2011年1月12日(水) 00:03
by h2so5
このコードはあくまでやり方の1つで定石ではないので参考にどうぞ。

例えば、"bca" という文字列が入力されたとします。
この場合、1回目のalpha(a)では、一番順番が若い'a' が返されます。

11行目では返す文字をresという変数に退避させます。
そして、12行目で返す文字列があった部分をz(一番順番が後)で置き換えます。

つまり "bca" → "bcz" となります。

こうすることで、2回目のalpha(a)では、今度は"bcz"内で一番順番が若い'b' が返されます。

これを3回繰り返せば、結果 a → b → c と出力されます。
元の文字列は "zzz" と全てzになります。

Re: 文字配列について

Posted: 2011年1月12日(水) 00:09
by beginner
>>h2so5さん
具体例を用いての分かりやすい説明ありがとうございます。
また質問すると思うのでその時はよろしくお願いします。