文字配列について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
beginner

文字配列について

#1

投稿記事 by beginner » 14年前

アルファベットの文字列を入力して関数に渡し辞書の並び順に並びかえて結果を表示するというプログラムをつくっているのですが、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;
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 文字配列について

#2

投稿記事 by h2so5 » 14年前

strcmp は文字列の比較をする関数であって、文字同士の比較はできません。

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

beginner

Re: 文字配列について

#3

投稿記事 by beginner » 14年前

>>h2so5さん
お返事ありがとうございます。
コンパイルして表示させるときに文字化けをするのですがどのようにすればよいですか。

アバター
さかまき
記事: 92
登録日時: 14年前

Re: 文字配列について

#4

投稿記事 by さかまき » 14年前

alpha の返値minがアルファベットのコード領域では無いから
化けるのだと思います。
関数alphaは何をしてますか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 文字配列について

#5

投稿記事 by h2so5 » 14年前

どの文字が化けるのですか?
日本語の部分か、それとも並べ替えたアルファベットですか?

beginner

Re: 文字配列について

#6

投稿記事 by beginner » 14年前

>>さかまきさん
関数alphaはmainで入力された文字列を辞書的な順序に並びかえるという役割をしていると思うのですが、
間違っていたら指摘のほうをお願いします。

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 文字配列について

#7

投稿記事 by h2so5 » 14年前

いま気づいたのですが、
関数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;
}
何か質問があればどうぞ。

beginner

Re: 文字配列について

#8

投稿記事 by beginner » 14年前

>>h2so5さん
11行目と12行目のコードがわからないので説明の方をお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 文字配列について

#9

投稿記事 by h2so5 » 14年前

このコードはあくまでやり方の1つで定石ではないので参考にどうぞ。

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

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

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

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

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

beginner

Re: 文字配列について

#10

投稿記事 by beginner » 14年前

>>h2so5さん
具体例を用いての分かりやすい説明ありがとうございます。
また質問すると思うのでその時はよろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る