ページ 11

string関数を教えてください。

Posted: 2014年11月20日(木) 11:35
by wakaba
課題で下の問題が出たんですが、どうしてもわからないので教えてください。

(1) 十分な大きさの文字配列1つと, 文字列または文字配列2つを指すポインタの計3つをこの順に引数に取り, 前者の文字配列内に後2者の文字列を順に結合して格納する関数str2cpy を定義しなさい.関数内で標準の文字列処理関数を使用すること.

実行時,最初の文字配列の内容は上書きしてよい. 戻り値は最初の文字配列を指すアドレスになるようにせよ.

ヒント: この関数のプロトタイプ宣言は次のように書ける.

char *str2cpy(char *dest, const char *s1, const char *s2);

注意: 確認のためmain関数からこの関数を呼び出す際は, 第一引数の配列は出来上がる文字列を格納できる大きさにしておくこと.


(2) 十分な大きさの文字配列1つと, 文字列または文字配列2つを指すポインタの計3つの引数をこの順に取り, 後2者の文字列を最初の文字配列の内容の後に順にアペンドする関数 str2catを定義しなさい. この関数は第一引数の文字配列が空の場合はLEVEL2と同じ結果となるが, 空でない場合は文字列の後に第二,第三引数の内容が連結される.

ヒント: この関数のプロトタイプ宣言は次の通り.

char *str2cat(char *dest, const char *s1, const char *s2);

Re: string関数を教えてください。

Posted: 2014年11月20日(木) 11:51
by Blue
具体的にどこまで出来ていてどこがわからないんでしょうか?
全部わからないはなしで。

出来ているところまでのコードは載せられますか?

wakaba さんが書きました:関数内で標準の文字列処理関数を使用すること.
おそらく、string.h の strcpy と strcat でいいのかな?

Re: string関数を教えてください。

Posted: 2014年11月20日(木) 11:59
by wakaba
#include<stdio.h>
#include<string.h>


int main(void)
{
char dest[100]="abc";
char s1[]="def";
char s2[]="ghi";
strcpy(dest,s1);
strcpy(dest+strlen(dest),s2);

printf("%s\n",dest);
return 0;
}

(1)で期待する結果は出たんですけど、 戻り値は最初の文字配列を指すアドレスというところからいまいちわかっていません。

Re: string関数を教えてください。

Posted: 2014年11月20日(木) 12:11
by Blue
wakaba さんが書きました: strcpy(dest+strlen(dest),s2);
ここはstrlenとstrcpyを使わなくてもstrcatでも可能ですね。

コード:

strcat(dest,s2);
まずはmain関数と別にstr2cpy関数を作りましょう。mainからはその関数を呼ぶようにする。
つまり

コード:

int main()
{
    char dest[100]="abc";
    char s1[]="def";
    char s2[]="ghi";
    str2cpy(dest,s1,s2);

    printf("%s\n",dest);
    return 0;
}
とし、

コード:

char *str2cpy(char *dest, const char *s1, const char *s2)
{
    strcpy(dest,s1);
    strcat(dest,s2);
    retunr ???;
}
てなかんじで。

???の部分は
戻り値は最初の文字配列を指すアドレス
ということなので、

コード:

return dest;
となりますね。

Re: string関数を教えてください。

Posted: 2014年11月20日(木) 12:41
by wakaba
(1)の内容は理解できました。(1)を参考に(2)を次にやろうとして下のプログラミングを書きました。しかし期待どおりの実行結果がでませんでした。
何が間違ってるのかよろしければ教えてください。
#include<stdio.h>
#include<string.h>

char *str2cpy(char *dest, const char *s1, const char *s2)
{
strcpy(dest,s1);
strcat(dest,s2);
return dest;
}

char *str2cat(char *dest, const char *s1, const char *s2)
{
strcat(dest,s1);
strcat(dest,s2);
return dest;
}

int main(void)
{
char id[]="140-T3823";
char dest[100]="abc";
char s1[]="def";
char s2[]="ghi";
int x;
int y;
x=str2cpy(dest,s1,s2);
printf("%s\n",id);
printf("%s\n",x);
y=str2cat(dest,s1,s2);
printf("%s\n",y);
return 0;
}

Re: string関数を教えてください。

Posted: 2014年11月20日(木) 13:12
by Blue
wakaba さんが書きました: int x;
int y;
ここは、str2cpy・str2catともに戻り値が char* ですので

コード:

char* x;
char* y;
としたほうがいいですね。(結果的にはxもyも同じ値になりますけど)

str2catを呼ぶときに、destの中身が「defghi」になってしまっているので、「defghidefghi」と出ます。
str2catのほうの期待した結果が、「abcdefghi」であるのであれば、直前で初期化します。

コード:

strcpy(dest,"abc");
y=str2cat(dest,s1,s2);

Re: string関数を教えてください。

Posted: 2014年11月20日(木) 15:01
by wakaba
理解することができました。 
ありがとうございました。