重要課題 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"
%
発展課題 14..2
重要課題12.3で作成した関数をポインタを使って実現せ よ。すなわち、2つのchar型配列x[/url],y[/url]に格納された文字列を入れ替える プログラムを,関数swap_stringWithPointer(char *, char *)を用いて実 装せよ.下記の例では,2つの文字列xとyをキーボードから入力し,入れ替えた後 に表示している.
% ./stringSwap
文字列x (20字まで)? Ritsumeikan
文字列y (20字まで)? BKC
入替後の x: "BKC"
入替後の y: "Ritsumeikan"
%
学校の前期の課題を復習していてわからないことがあったので質問します。
自分で考えてソースを書いてコンパイルして実行するとなぜか入力できなくなっています。
どう直せばよいでしょうか?
自分が書いたソース↓
#include <stdio.h>
# define BUFFER_SIZE (20)
int get_int(void)
{
char buf[BUFFER_SIZE];
fgets(buf, BUFFER_SIZE, stdin);
return atoi(buf);
}
void swap_string(char *,char *);
int main(void){
int i,j;
char arrayX[BUFFER_SIZE],arrayY[BUFFER_SIZE];
char *p,*q;
//pの初期値を配列の先頭に設定
p = arrayX;
q = arrayY;
//入力
printf("文字列x(20字まで) :");
for(i=0; i!='\0' ; i++){
*p = get_int();
p++;
}
printf("\n");
printf("文字列y(20字まで) :");
for(j=0; j!='\0' ; j++){
*q = get_int();
q++;
}
printf("\n");
swap_string(p,q);
printf("入り替え後のx :");
for(i=0 ; i !='\0'; i++){
printf("%c",*p);
}
printf("\n");
printf("入り替え後のy :");
for(j=0; j!= '\0'; j++){
printf("%c",*q);
}
printf("\n");
return 0;
}
void swap_string(char *a,char *b){
int i,temp[BUFFER_SIZE];
for(i=0 ; i< BUFFER_SIZE ; i++){
temp = *a;
*a = *b;
*b = *a;
a++;
b++;
}
}
z
ポインタを使った文字列交換
Re:ポインタを使った文字列交換
前にも書きましたが、処理の途中にprintf関数を置いて、自分の意図する動きになっているかを確認してみてください。
それでも分からなければ、また質問しにきてください。
自分で修正できる力を身に付けなければ、復習する意味が全くありませんよ。
それでも分からなければ、また質問しにきてください。
自分で修正できる力を身に付けなければ、復習する意味が全くありませんよ。
Re:ポインタを使った文字列交換
質問者へ:
>(11) : error C3861: 'atoi': 識別子は、引数依存の照合を使用しても見つかりません。
ということです。
-- 追記
わざとエラーログを書いておきます
-- 追記2
既出:http://www.play21.jp/board/formz.cgi?ac ... &rln=61125t=
>(11) : error C3861: 'atoi': 識別子は、引数依存の照合を使用しても見つかりません。
ということです。
-- 追記
わざとエラーログを書いておきます
-- 追記2
既出:http://www.play21.jp/board/formz.cgi?ac ... &rln=61125t=
Re:ポインタを使った文字列交換
なんとかこの問題を解くことできました。
変更したのは
25~35行目の
for(i=0; i!='\0' ; i++){
*p = get_int();
p++;
}
をfgets(*p,BUFFER_SIZE,stdin);
にかえたことと
38~46行目の
for(i=0 ; i !='\0'; i++){
printf("%c",*p);
}
をwhile(*p){
printf("%c",*p);
}
にかえたことと
char *k;
k=array;
にして
55~62行目の
for文の中を
array= *p
から*k =*p
にしたことです
みなさんありがとうございます
変更したのは
25~35行目の
for(i=0; i!='\0' ; i++){
*p = get_int();
p++;
}
をfgets(*p,BUFFER_SIZE,stdin);
にかえたことと
38~46行目の
for(i=0 ; i !='\0'; i++){
printf("%c",*p);
}
をwhile(*p){
printf("%c",*p);
}
にかえたことと
char *k;
k=array;
にして
55~62行目の
for文の中を
array= *p
から*k =*p
にしたことです
みなさんありがとうございます
Re:ポインタを使った文字列交換
解決したようだけど、scanf関数は使ってはいけないのでしょうか?
#include <stdio.h> #define BUFFER_SIZE 20 void swap_string(char str1[/url], char str2[/url]) { char tmp; int i; for (i = 0; i < BUFFER_SIZE; ++i) { tmp = str1; str1 = str2; str2 = tmp; } } void swap_stringWithPointer(char* str1, char* str2) { char tmp; int i; for (i = 0; i < BUFFER_SIZE; ++i) { tmp = *(str1 + i); *(str1 + i) = *(str2 + i); *(str2 + i) = tmp; } } int main(void) { char x[BUFFER_SIZE + 1] = {0, }; char y[BUFFER_SIZE + 1] = {0, }; printf("文字列x (20字まで)? "); scanf("%20s%*[^\n]", x); printf("文字列y (20字まで)? "); scanf("%20s%*[^\n]", y); swap_string(x, y); printf("swap_string\n"); printf("入り替え後のx : %s\n", x); printf("入り替え後のy : %s\n", y); swap_stringWithPointer(x, y); printf("swap_stringWithPointer\n"); printf("入り替え後のx : %s\n", x); printf("入り替え後のy : %s\n", y); return 0; }