ページ 11

ポインタを使った文字列交換

Posted: 2010年9月12日(日) 16:35
by blue
重要課題 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++;
}
}


Re:ポインタを使った文字列交換

Posted: 2010年9月12日(日) 16:41
by バグ
前にも書きましたが、処理の途中にprintf関数を置いて、自分の意図する動きになっているかを確認してみてください。
それでも分からなければ、また質問しにきてください。
自分で修正できる力を身に付けなければ、復習する意味が全くありませんよ。

Re:ポインタを使った文字列交換

Posted: 2010年9月12日(日) 16:46
by シエル
なんか色んな名前使ってますね。

Re:ポインタを使った文字列交換

Posted: 2010年9月12日(日) 18:47
by フリオ
 
 処理が云々以前に課題の解釈を間違っているのではないでしょうか。

Re:ポインタを使った文字列交換

Posted: 2010年9月12日(日) 20:40
by naohiro19
質問者へ:
>(11) : error C3861: 'atoi': 識別子は、引数依存の照合を使用しても見つかりません。
ということです。

-- 追記
わざとエラーログを書いておきます

-- 追記2
既出:http://www.play21.jp/board/formz.cgi?ac ... &rln=61125t=

Re:ポインタを使った文字列交換

Posted: 2010年9月13日(月) 12:06
by blue
なんとかこの問題を解くことできました。
変更したのは
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:ポインタを使った文字列交換

Posted: 2010年9月13日(月) 15:53
by バグ
解決したようだけど、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;
}

Re:ポインタを使った文字列交換

Posted: 2010年9月13日(月) 22:55
by blue
scanfでもできます。fgetsだと出力のあとprintf("\n");で改行する必要はないですが、scanfだとしなければいけません。

Re:ポインタを使った文字列交換

Posted: 2010年9月14日(火) 03:14
by バグ
おっと、失礼しました。fgetsに変更したというのを読んでいませんでしたm(_ _)m