ページ 11

おそらく初歩の初歩だと思われますが、、、、

Posted: 2016年11月16日(水) 01:05
by C言語彷徨い人

コード:

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


char mystr2cpy (*char a, *char b)
{

  char c;
  strcat(a, b);
  strcpy(c, a); 
  return 0;
}
という関数を定義したのですが、5: ) が必要と出て実行できません。
一応ネット等で調べはしたのですが結局原因がわかりません、、、、、
)は書いているのになんで??という質問です、なお自分は超初心者なので優しく教えてもらえると嬉しいです。

Re: おそらく初歩の初歩だと思われますが、、、、

Posted: 2016年11月16日(水) 01:17
by box
C言語彷徨い人 さんが書きました:

コード:

char mystr2cpy (*char a, *char b)
引数の書き方と戻り値の型が違う。
char *mystr2cpy (char *a, char *b)ではないですか?
C言語彷徨い人 さんが書きました:

コード:

  char c;
変数cはchar型1バイトしかないので、
C言語彷徨い人 さんが書きました:

コード:

  strcpy(c, a); 
こういう書き方はできないはず。
C言語彷徨い人 さんが書きました:

コード:

  return 0;
もともとのコードではchar型を返すことになっているのに0を返すのは不自然。

Re: おそらく初歩の初歩だと思われますが、、、、

Posted: 2016年11月16日(水) 01:58
by box
こんな感じですかね。合ってるかどうかは知らないけど。

コード:

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

char *mystr2cpy(char *a, char *b)
{
    // staticがないと、関数内部のautomaticなローカル変数のアドレスを返そうと
    // することとなる。ところが、cは本関数を抜けた瞬間に雲散霧消してしまう。
    // main関数で正しく受け取れない。
    static char c[256];     // aとbを連結した結果を格納できる十分な大きさであること

    strcpy(c, strcat(a, b));
    return c;
}

int main(void)
{
    char a[] = "abcde", b[] = "ABCDE";

    printf("%s\n", mystr2cpy(a, b));
    return 0;
}

Re: おそらく初歩の初歩だと思われますが、、、、

Posted: 2016年11月16日(水) 10:37
by みけCAT
box さんが書きました:合ってるかどうかは知らないけど。
間違っていますね。
aに対する範囲外への書き込みが行われ、未定義動作になります。

もともと提示されたコードでもstrcat(a, b);が使用され、引数にconstも無いので、
aが指す文字列を書き換えるのは仕様であると推測できます。
したがって、a[]をたとえばa[11]とし、十分な要素数を確保するといいでしょう。

Re: おそらく初歩の初歩だと思われますが、、、、

Posted: 2016年11月16日(水) 23:00
by Dixq (管理人)
実装したい関数の仕様を明確にしてもらった方が答えやすいと思います。
(例えばstrcpyと同じ動作をする自作関数を作りたい等)