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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
C言語彷徨い人

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

#1

投稿記事 by C言語彷徨い人 » 7年前

コード:

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


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

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

box
記事: 2002
登録日時: 13年前

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

#2

投稿記事 by box » 7年前

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を返すのは不自然。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

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

#3

投稿記事 by box » 7年前

こんな感じですかね。合ってるかどうかは知らないけど。

コード:

#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;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 7年前

box さんが書きました:合ってるかどうかは知らないけど。
間違っていますね。
aに対する範囲外への書き込みが行われ、未定義動作になります。

もともと提示されたコードでもstrcat(a, b);が使用され、引数にconstも無いので、
aが指す文字列を書き換えるのは仕様であると推測できます。
したがって、a[]をたとえばa[11]とし、十分な要素数を確保するといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

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

#5

投稿記事 by Dixq (管理人) » 7年前

実装したい関数の仕様を明確にしてもらった方が答えやすいと思います。
(例えばstrcpyと同じ動作をする自作関数を作りたい等)

閉鎖

“C言語何でも質問掲示板” へ戻る