ページ 11

無題

Posted: 2010年9月06日(月) 12:12
by a
重要課題 12..3
2つのchar型配列x[/url],y[/url]に格納された文字列を入れ替えるプログラムを作 成せよ.ただし入替え処理には,関数swap_string(char [/url],char [/url])を作 成して用いること.下記の例では,2つの文字列xとyをキーボードから入力し,入 れ替えた後に表示している.

% ./stringSwap
文字列x (20字まで)? Ritsumeikan
文字列y (20字まで)? BKC
関数swap_string()を呼び出しました
入替後の x: "BKC"
入替後の y: "Ritsumeikan"
%
っていう問題が少しわかりません

私の作ったソース↓

#include<stdio.h>

#define BUFFER_SIZE 20

int swap_string(char x[/url],char y[/url]){
char temp[BUFFER_SIZE];
int i;
for(i=0;i<20;i++){
temp=x;
}
for(i=0;i<20;i++){
y=x;
}
for(i=0;i<20;i++){
x=temp;
}
printf("入替後のx: ");
for(i=0;x!=" ";i++){
printf("%c",x);
}
for(i=0;y!=" ";i++){
printf("%c",y);
}
}


int main(void){
char x[BUFFER_SIZE];
char y[BUFFER_SIZE];
printf("文字列x (20字まで)? ");
fgets(x,BUFFER_SIZE,stdin);
printf("文字列y (20字まで)? ");
fgets(y,BUFFER_SIZE,stdin);
swap_string(x, y);
return 0;
}

18、21行目がエラーになります。ポインタと整数の比較を行っています。とエラー文がでますがどういうことでしょうか?どう直せばよいでしょうか?

Re:無題

Posted: 2010年9月06日(月) 12:32
by YuO
「何行目」だけではなく,どこがその行かわかるように書いてください。

で,原因ですが……「文字」と「文字列」を区別してください。
・「文字」は1文字,「文字列」は0文字以上の文字 + 終端のナル文字
・「文字」定数は''で,「文字列」定数は""で囲む
・「文字」はchar型,「文字列」はchar *型
です。

今回,比較左辺のxはcharの配列型に添字演算子を使っていますから,char型,つまり文字です (18行目)。
それに対して右辺は" "と,文字列 (char *型) を対象にしていますから,そのようなエラーになります。
文字' 'とすれば,エラーはなくなるはずです。


---- 余談 ----
仕様書的な正確さは無視しています。
文字定数に複数文字指定できるとか,文字定数はint型だとか,文字列定数はchar型の配列だとか。
また,Cでコンパイルしているならエラーではなく警告だと思います。

Re:無題

Posted: 2010年9月06日(月) 12:36
by うしお
追加ですが、
またswap_stringが戻り値を返しわすれています。

また、終端文字は\0を使うのが普通です。
なので上記のは
y!='\0'と直さなければ実行時に不正な動作をする場合があるでしょう

とはいっても
for(i=0;x!='\0';i++){
printf("%c",x);
}
とはせずに
単純に
printf("%s",x);として終端まで表示するのが良いかもしれません

Re:コンパイルは通ったが・・・

Posted: 2010年9月06日(月) 13:24
by a
Yuoさんの言うとおり" "を' 'に変えるとコンパイルが通りましたが、実行してみると文字化けしておかしな結果になります。まだおかしいところがあるみたいですが、どこを直せばよいと思いますか?

Re:コンパイルは通ったが・・・

Posted: 2010年9月06日(月) 13:42
by アビゲイル
ゴミを出力してるんじゃないかな?
うしおさんが書いてる通りにしてみればどうですか。
>printf("%s",x);として終端まで表示するのが良いかもしれません

後、入れ替えてません。
temp=x;
y=x;
x=temp;

Re:コンパイルは通ったが・・・

Posted: 2010年9月06日(月) 14:58
by パコネコ
for(i=0;i<20;i++){
temp=x;
}
for(i=0;i<20;i++){
y=x;
}
for(i=0;i<20;i++){
x=temp;
}
この辺の条件書き変えたらうごきましたよ?
y=x//これも反対では?
xも20文字確定ですか?
x[/url]で受け取ったときに何も入ってない場所も受け取るのでしょうか?
i<20をそれぞれx!='\0'みたいなのに変更でうごきましたし…
変更前はその場所からの読み込み禁止と怒られたのですが…文字化けもいっぱいありました。

Re:コンパイルは通ったが・・・

Posted: 2010年9月06日(月) 15:34
by ookami
好みもあるので、ついで程度に聞いてもらえれば。
・「C++ 文字列 コピー」あたりでググってみるといいかも。
・「swap_string」という名前からして、出題者は、
 swap_string関数の中では「入れ替え処理」だけさせて、
 表示まではさせない、という意図だと思います。

Re:できました!!

Posted: 2010年9月06日(月) 17:19
by a
おかげさまでうまくいきました。本当にありがとうございます。

Re:できました!!

Posted: 2010年9月06日(月) 17:29
by a
ありがとうございます