重要課題 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:無題
「何行目」だけではなく,どこがその行かわかるように書いてください。
で,原因ですが……「文字」と「文字列」を区別してください。
・「文字」は1文字,「文字列」は0文字以上の文字 + 終端のナル文字
・「文字」定数は''で,「文字列」定数は""で囲む
・「文字」はchar型,「文字列」はchar *型
です。
今回,比較左辺のxはcharの配列型に添字演算子を使っていますから,char型,つまり文字です (18行目)。
それに対して右辺は" "と,文字列 (char *型) を対象にしていますから,そのようなエラーになります。
文字' 'とすれば,エラーはなくなるはずです。
---- 余談 ----
仕様書的な正確さは無視しています。
文字定数に複数文字指定できるとか,文字定数はint型だとか,文字列定数はchar型の配列だとか。
また,Cでコンパイルしているならエラーではなく警告だと思います。
で,原因ですが……「文字」と「文字列」を区別してください。
・「文字」は1文字,「文字列」は0文字以上の文字 + 終端のナル文字
・「文字」定数は''で,「文字列」定数は""で囲む
・「文字」はchar型,「文字列」はchar *型
です。
今回,比較左辺のxはcharの配列型に添字演算子を使っていますから,char型,つまり文字です (18行目)。
それに対して右辺は" "と,文字列 (char *型) を対象にしていますから,そのようなエラーになります。
文字' 'とすれば,エラーはなくなるはずです。
---- 余談 ----
仕様書的な正確さは無視しています。
文字定数に複数文字指定できるとか,文字定数はint型だとか,文字列定数はchar型の配列だとか。
また,Cでコンパイルしているならエラーではなく警告だと思います。
Re:コンパイルは通ったが・・・
Yuoさんの言うとおり" "を' 'に変えるとコンパイルが通りましたが、実行してみると文字化けしておかしな結果になります。まだおかしいところがあるみたいですが、どこを直せばよいと思いますか?
Re:コンパイルは通ったが・・・
ゴミを出力してるんじゃないかな?
うしおさんが書いてる通りにしてみればどうですか。
>printf("%s",x);として終端まで表示するのが良いかもしれません
後、入れ替えてません。
temp=x;
y=x;
x=temp;
うしおさんが書いてる通りにしてみればどうですか。
>printf("%s",x);として終端まで表示するのが良いかもしれません
後、入れ替えてません。
temp=x;
y=x;
x=temp;
Re:コンパイルは通ったが・・・
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'みたいなのに変更でうごきましたし…
変更前はその場所からの読み込み禁止と怒られたのですが…文字化けもいっぱいありました。
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:コンパイルは通ったが・・・
好みもあるので、ついで程度に聞いてもらえれば。
・「C++ 文字列 コピー」あたりでググってみるといいかも。
・「swap_string」という名前からして、出題者は、
swap_string関数の中では「入れ替え処理」だけさせて、
表示まではさせない、という意図だと思います。
・「C++ 文字列 コピー」あたりでググってみるといいかも。
・「swap_string」という名前からして、出題者は、
swap_string関数の中では「入れ替え処理」だけさせて、
表示まではさせない、という意図だと思います。