掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26465

配列とポインタのプログラムのチェック
投稿者---雪だるま(2006/03/20 04:15:11)


こんばんわ。雪だるまです。
配列とポインタを使ったプログラムの訂正問題で詰まっています。よろしければ、ご教授ください。コンパイルしたところ、文字数は計算されているようなのですが、文字列がうまくいきません。多分、コピーがうまくできてないんでしょうが・・・・・・。
チェックよろしくお願いします。
環境はOSがXPでVisual Studio 2005です。

問題 以下を訂正
#include <stdio.h>

int strlength(char str){
    int i;
    for(i=0;*(str++);i++);
    return i;
}

char *strcopy(char pdest,char psrc){
    char *ret=pdest;

    do{
        pdest=psrc;
        pdest++;
        psrc++;
    }while(*(psrc-1));
    return ret;
}

void main(){
    char a[31];
    char b[31];

    scanf("%30s",a);

    strcopy(*b,*a);
    printf("入力された文字数は%d文字です\n",strlength(*a));
    printf("入力された文字列は[%s]です\n",b);
}

自分で書いたプログラム
#include <stdio.h>

int strlength(char *str){
    int i;
    for(i=0;*(str++);i++);
    return i;
}

char strcopy(char pdest[31],char psrc[31]){
    char *ret=&pdest;

    do{
        pdest=psrc;
        pdest++;
        psrc++;
    }while(psrc!='\0');
    return *ret;
}

void main(){
    char a[31];
    char b[31];

    scanf("%30s",a);

    b=strcopy(b,a);
    printf("入力された文字数は%d文字です\n",strlength(a));
    printf("入力された文字列は[%s]です\n",b);
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:配列とポインタのプログラムのチェック 26466 επιστημη 2006/03/20 05:48:38
<子記事> Re:配列とポインタのプログラムのチェック 26484 雪だるま 2006/03/20 16:07:55


No.26466

Re:配列とポインタのプログラムのチェック
投稿者---επιστημη(2006/03/20 05:48:38)


> 文字数は計算されているようなのですが、文字列がうまくいきません。

なにが/どう「うまくいきません」かを説明してください。



この投稿にコメントする

削除パスワード

No.26467

Re:配列とポインタのプログラムのチェック
投稿者---雪だるま(2006/03/20 05:59:22)


>> 文字数は計算されているようなのですが、文字列がうまくいきません。
>
>なにが/どう「うまくいきません」かを説明してください。

失礼しました。

以下のプログラムで
#include <stdio.h>

int strlength(char *str){
    int i;
    for(i=0;*(str++);i++);
    return i;
}

char strcopy(char pdest[31],char psrc[31]){
    char *ret=pdest;

    do{
        pdest=psrc;
        pdest++;
        psrc++;
    }while(psrc!='\0');
    return *ret;
}

void main(){
    char a[31];
    char b[31];

    scanf("%30s",a);

    strcopy(b,a);
    printf("入力された文字数は%d文字です\n",strlength(a));
    printf("入力された文字列は[%s]です\n",b);
}

文字列がうまく表示されず、こんな結果になります。(abcを入力したとき)

abc
入力された文字数は3文字です
入力された文字列は[@]です




この投稿にコメントする

削除パスワード

No.26468

Re:配列とポインタのプログラムのチェック
投稿者---Blue(2006/03/20 08:43:24)


>    do{
>        pdest=psrc;
>        pdest++;
>        psrc++;
>    }while(psrc!='\0');

ここの処理がどんなものなのか今一度確認してみてはどうでしょうか?

    do{
       // 確認用 printf
      printf( "pdest=%p *pdest=%c\n", ( void* )pdest, *pdest );
      printf( "psrc =%p *psrc =%c\n", ( void* )psrc,  *psrc  );
       pdest = psrc; // 何をコピーしている?
       pdest++;
       psrc++;
    }while(psrc!='\0');



怪しいところに printf 文を入れてみるのはいちばん単純なデバッグ方法です。
次回から一度試して、掲示板で聞かれてみてはどうでしょうか?


この投稿にコメントする

削除パスワード

No.26483

Re:配列とポインタのプログラムのチェック
投稿者---雪だるま(2006/03/20 15:55:15)


><pre>> do{
> pdest=psrc;
> pdest++;
> psrc++;
> }while(psrc!='\0');</pre>
>ここの処理がどんなものなのか今一度確認してみてはどうでしょうか?
>
><pre> do{
<b><font color="red">// 確認用 printf
printf( "pdest=%p *pdest=%c\n", ( void* )pdest, *pdest );
printf( "psrc =%p *psrc =%c\n", ( void* )psrc, *psrc );</font></b>
pdest = psrc; // 何をコピーしている?
pdest++;
psrc++;
}while(psrc!='\0');</pre>
>
>
>怪しいところに printf 文を入れてみるのはいちばん単純なデバッグ方法です。
>次回から一度試して、掲示板で聞かれてみてはどうでしょうか?

ええっと、やってみました。むちゃくちゃな結果になりました(汗)。
とりあえず、考え直してみます。
アドバイス、ありがとうございました。


この投稿にコメントする

削除パスワード

No.26484

Re:配列とポインタのプログラムのチェック
投稿者---雪だるま(2006/03/20 16:07:55)


改めて
プログラムを書き直しました。
#include <stdio.h>

int strlength(char *str){
    int i=0;
    while(*str!='\0'){
        i++;
        *str++;
    }
    return i;
}

char strcopy(char *pdest[31],char *psrc[31]){
    char *ret=pdest;

    do{
        *pdest++=*psrc++;
    }while(*psrc!='\0');
    return ret;
}

void main(){
    char a[31];
    char b[31];

    scanf("%30s",a);

    strcopy(b,a);
    printf("入力された文字数は%d文字です\n",strlength(a));
    printf("入力された文字列は[%s]です\n",b);
}

これでうまくコンパイルできたのですが、
char strcopy(char *pdest[31],char *psrc[31]){
    char *ret=pdest;

    do{
        *pdest++=*psrc++;
    }while(*psrc!='\0');
    return ret;
}


のretが何のためにあるのかいまいち良く分かりません。よろしければ教えてください。よろしくお願いします。


この投稿にコメントする

削除パスワード

No.26485

Re:配列とポインタのプログラムのチェック
投稿者---雪だるま(2006/03/20 16:12:15)


さらにコンパイルはうまくいっても、文字数の結果が何を入力しても7文字になってしまいます。
アドバイスお願いします。


この投稿にコメントする

削除パスワード

No.26486

Re:配列とポインタのプログラムのチェック
投稿者---とろり(2006/03/20 19:39:19)


こんばんは。

> これでうまくコンパイルできたのですが
コンパイルできても警告が残るでしょう?
試しに、WinXP VC++ 6.0 でコンパイルして実行すると落ちました。

> のretが何のためにあるのかいまいち良く分かりません。
私も良く分かりません。
今回の場合は戻り値は特に必要ありません。拡張性を考慮して記述しているのではないでしょうか。

ここで、strcopy()関数の戻り値の型が char となっているのに char* ret を返そうとしています。
(上記で述べた通り、必要性は感じられないのですが)この場合、コピー先文字列の先頭アドレスを返すのが適当なので、
> char strcopy()
char* strcopy()

strcopy()関数への引数は a[31] と b[31] の先頭アドレスを渡すようにします。
> char strcopy(char *pdest[31],char *psrc[31]){
char* strcopy(char *pdest, char *psrc) {


これでコンパイルは通りますが、問題があります。
strcopy()関数はコピー元からコピー先へ文字列を1文字づつコピーしていますが、終端文字を格納していないので、実行結果は不定となります。
strcopy()関数が内部で何を行っているかを理解することで解決できます。



この投稿にコメントする

削除パスワード

No.26492

Re:配列とポインタのプログラムのチェック
投稿者---雪だるま(2006/03/21 05:20:42)


こんばんわ。アドバイスありがとうございました。


>これでコンパイルは通りますが、問題があります。
>strcopy()関数はコピー元からコピー先へ文字列を1文字づつコピーしていますが、終端文字を格納していないので、実行結果は不定となります。
>strcopy()関数が内部で何を行っているかを理解することで解決できます。
ご指示通りプログラムを修正したあと、
*pdest='\0';を
付け加えるとコンパイルが通りました。
文字列には¥0が必要だということ分かっていたのに、付け忘れてました。
この修正問題で、まだポインタや関数について理解不足だなあとまざまざと思い知らされた感じです。
また何かありましたら、よろしくお願いします。





この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧