【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


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

No.18439

複数の戻り値で文字列を返す方法
投稿者---aki(2004/11/29 11:58:08)


よろしくお願い致します。
サイトを検索してintやcharの場合は引数にアドレスを指定して
関数側でそのアドレスに値を入れて返すことはできました。
しかし文字列を返すことができないのです。
呼び出し側で配列やポインタ変数を使って文字列のメモリ領域を作成しているつもりですが、呼び出された側でその値に書き込んで(上書きして)返すことはできないのでしょうか?ポインタの場合は宣言しただけでは領域が確保されないとあったので初期化してからやっておりますが、書き換わりません。
ソースは以下です。よろしくお願いいたします。
#include <stdio.h>
#include <string.h>

int hello(char *moji, char *ans)
{
    char *s = "ab";
    printf("Res: %s\n",moji);
    printf("1: %s\n",ans);

    if (strcmp(moji , s) == 0)
    {
        
        //*ans = 'Y'; //char
        //strcpy(ans,"OK");
        //ans = '\0';
        ans = "OK";
        printf("2: %s\n",p);
        return 0;
    }
    else{
        //*ans = 'N';
        *ans = "NG";
        printf("2: %s\n",*ans);
        return -1;
    }
}

int main()
{
    char moji[100];
    char *p;
    int p1;
    //char p2 = 't';
    int rc;
    char *p3 = "tt";
    //char p3[] = "tt";
    printf("word=");
    scanf("%s",moji);
    
    p = moji;
    //rc=hello(p, &p1); //int
    //rc=hello(p, &p2); //char
    rc=hello(p, p3);
    if (rc == -1){
        printf("%s\n",p3);
    }
    else{
        printf("%s\n",p3);
    }
    return 0;
}





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:複数の戻り値で文字列を返す方法 18440 朱鷺 2004/11/29 12:50:27
<子記事> Re:複数の戻り値で文字列を返す方法 18441 朱鷺 2004/11/29 12:52:36
<子記事> Re:複数の戻り値で文字列を返す方法 18444 monkey 2004/11/29 13:16:19
<子記事> Re:複数の戻り値で文字列を返す方法 18446 REE 2004/11/29 13:25:23


No.18440

Re:複数の戻り値で文字列を返す方法
投稿者---朱鷺(2004/11/29 12:50:27)


引数にポインタを渡して関数内で領域を確保して操作することは
可能です。
char *p;

void abc(char *p)
{
p = (char *)malloc(...);
}

こんな感じ。最近はmalloc使ってないので使い方間違ってるかも^^;
希望した答えじゃなかったらごめんね


この投稿にコメントする

削除パスワード

No.18441

Re:複数の戻り値で文字列を返す方法
投稿者---朱鷺(2004/11/29 12:52:36)


ポインタはあくまでも領域のアドレスを指すものなので
使い回しができます。


この投稿にコメントする

削除パスワード

No.18443

Re:複数の戻り値で文字列を返す方法
投稿者---aki(2004/11/29 13:10:15)


朱鷺さん、レスありがとうございます。
先程、関数側で配列の要素を一字ずつ変えたり、strcpyを利用することで呼び出し側の値も書き換わることができました。
朱鷺さんにアドバイス頂いた方法でも、これから試してみます。



この投稿にコメントする

削除パスワード

No.18444

Re:複数の戻り値で文字列を返す方法
投稿者---monkey(2004/11/29 13:16:19)


文字列を別の文字列に書き替えるには、strcpyを使うのがよろしいかと。

#include <stdio.h>
#include <string.h>

int hello( const char *moji, char *ans )
{
    const char *s = "ab";
    printf( "Res: %s\n", moji );
    printf( "1: %s\n", ans );

    if ( strcmp( moji, s ) == 0 ){
        strcpy( ans, "OK" );
        printf( "2: %s\n", ans );
        return 0;
    }
    else{
        strcpy( ans, "NG" );
        printf( "2: %s\n", ans );
        return -1;
    }
}

int main()
{
    char moji[100];
    // char* p3 = "tt";  // これは却下.∵文字列リテラルが書き替えられる可能性あり.
    // char p3[] = "tt"; // p3に最大2文字しか格納されないのが確実ならばOKだが,
    char p3[100] = "tt"; // それが確実でないなら,余裕をもって確保するのがベター.
    int rc;

    printf( "word=" );
    scanf( "%s", moji );

    rc = hello( moji, p3 );
    if ( rc == -1 ){
        printf( "%s\n", p3 );
    }
    else{
        printf( "%s\n", p3 );
    }
    return 0;
}



この投稿にコメントする

削除パスワード

No.18447

Re:複数の戻り値で文字列を返す方法
投稿者---aki(2004/11/29 13:25:41)


monkeyさん、レスありがとうございます。
やはり配列で領域を多く確保しておくのがベターでしょうか。
コメントを書いて下さったのでとても助かりました。
ポインタでもできるように頑張ってみます。



この投稿にコメントする

削除パスワード

No.18446

Re:複数の戻り値で文字列を返す方法
投稿者---REE(2004/11/29 13:25:23)


>呼び出し側で配列やポインタ変数を使って文字列のメモリ領域を作成しているつもりですが、呼び出された側でその値に書き込んで(上書きして)返すことはできないのでしょうか?

出来ます。

>ポインタの場合は宣言しただけでは領域が確保されないとあったので初期化してからやっておりますが、書き換わりません。
>ソースは以下です。よろしくお願いいたします。

ソースを見ましたが、ポインタは設定されていますが、結果を受け取る領域が確保されていません。
配列を使用するか、mallocなどで動的に確保する必要があります。

また、hello関数が受け取った領域に設定する時には、strcpyを使用します。
この場合の引数ansはmain側で確保した領域を指しているポインタですので、直接代入してしまっては、結果を格納する場所を見失ってしまいます。

簡単にいうと、main側では、配列を用意して、その先頭アドレスを渡せばよい。(mojiと同じようにすればよいです)
hello側では、strcpyで、結果を格納すればよい。ということになります。



この投稿にコメントする

削除パスワード

No.18448

Re:複数の戻り値で文字列を返す方法
投稿者---aki(2004/11/29 13:28:39)


REEさん、レスありがとうございました。
配列とstrcpyで先程できました。
malloc()で動的確保する方法を今試しております。
わかりやすい説明をどうもありがとうございました。


この投稿にコメントする

削除パスワード

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