dポイントプレゼントキャンペーン実施中!

ある関数内で、作成した、文字列をmainプログラムでうけとるにはどのようにすればよいのでしょうか。
普通の変数の場合は解説書に例はありますが、配列の場合の例は見つかりませんでした。
以下は例です。gccを使っています。

int main(){
char str[20]; // sub内で加工した文字列を受け取る配列
...
sub( str );
....
}
void sub( char *ch ){
....
ch="ABCD"; // この値をmainプログラム内でつかいたい
....
}

A 回答 (5件)

No2のかたが言われているように、strcpyを使用して、文字列を設定します。


厳密に言えば、strcpyの他にも方法はありますが、現時点では、strcpyと覚えておけばよいでしょう。
但し、strcpyを使用する場合、一点、必ず、守らなければいけないことがあります。
それは、呼び出し元のサイズ(今回は20バイト)を超えるサイズを設定してはいけないということです。
もし、strcpy(ch,"ABCDEFGHIJKLMNOPQRSTUVZWYZ");
を行うと、コンパイルは正常に終了しますが、呼び出し側で確保した20バイトを突き破りメモリの設定を行います。
その結果、異常終了します。(場合によっては、異常終了せずに、正常のようにみえることもあります)
----------------------------------------------------
#include<stdio.h>
#include<string.h>
void sub( char *ch ); //プロトタイプ宣言
int main(){
char str[20]; // sub内で加工した文字列を受け取る配列
sub( str );
printf("%s",str); //受け取った結果を印字
}
void sub( char *ch ){
strcpy(ch,"ABCD"); // この値をmainプログラム内でつかいたい
}
-----------------------------------------------------
実行結果
ABCD
    • good
    • 2
この回答へのお礼

ポインタをきちんと理解できておらず、困っていました。
考え方は変数の場合とおなじでしょうか。
たとえば、
main 関数で、
  sub( str ); として、sub関数をよんだときの、引数strは 配列strのアドレスなのでしょうか。 とすると、呼び出し側の引数はアドレスで、呼び出される関数の引数はポインタとするということでしょうか。
これでいくらか理解できました。
ありがとうございました。

お礼日時:2017/07/23 13:51

おっと。


配列の名前を引数にして strcpy を使うのは、正しい処理なので、OKです。

ただ多くの場合、sprintf をお勧めします。
この例だと
sprintf(ch, "ABCD"); でOK
文字列の整形も
sprintf(ch, "result=%5d(%4dtimes)", result, coount) のようにお手軽です。
    • good
    • 0
この回答へのお礼

sprintf という便利な関数があったのですね。勉強になりました。

お礼日時:2017/07/23 13:51

sub の引数を char ch[] とすれば良いです。


(char ch[20]ではないことに注意)
これで ch="ABCD"; はエラーになるはず。
ch[0]='A';
ch[1]='B';
ch[2]='C';
ch[3]='D';
ch[4]='\0';
と、配列として正しい処理をすれば、main に反映されます。
    • good
    • 0
この回答へのお礼

この配列を使った方法も試してみます。
ありがとうございました。

お礼日時:2017/07/23 13:52

strcpy()関数で、chの指す配列に文字列データ"ABCD"をコピーすればよいと思います。



つまり
 ch="ABCD";
の代わりに、
 strcpy("ABCD",ch);
ですね。

ちなみに
 ch="ABCD";
では、せっかく呼び出し側が教えてくれたchの指す配列場所を忘れて、
chに "ABCD" を指させることになってしまいます。


(うる覚えなのでパラメタの指定は逆にstrcpy(ch,"ABCD");かもしれません。ちゃんと調べてから使ってくださいね)
    • good
    • 0

mail関数内に変数を定義し、下位関数を呼び出す際にその“ポインター”を引数として渡す。


または外部変数とする。

ご質問に書かれているのはポインターではなく変数そのもを引数に入れています。これではダメです。

参考まで。
    • good
    • 0
この回答へのお礼

ご教授くださり、ありがとうございます。
外部変数とはグローバル変数のことでしょうか。

お礼日時:2017/07/23 13:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!