ページ 11

グローバル変数をつかわない

Posted: 2011年6月24日(金) 21:28
by IM
こんにちは。
以下のコードには文字列を結合させる関数と結合後の文字列を表示する関数が含まれています。グローバル変数char f[5];を用いていますが、これを用いずに実現する方法はないでしょうか。
あくまで、
 文字列を結合させる関数
 結合させた文字列を表示する関数
の2の役割はそのまま残す感じにしたいです。

コード:


#include <stdio.h>

char f[5];
void mozi_setuzoku(){
	char c[3]="ab";
	char b[3]="cd";
	sprintf(f,"%s%s",c,b);
}

void mozi_hyouzi(){
	printf("fは\"%s\"です",f);
}

void main(){
	mozi_setuzoku();
	mozi_hyouzi();
}
自分なりに考えてみたところ、

コード:


#include <stdio.h>

void mozi_hyouzi(char *f){
	printf("fは\"%s\"です",f);
}

void mozi_setuzoku(){
	char c[3]="ab";
	char b[3]="cd";
	char f[100];
	sprintf(f,"%s%s",c,b);
	mozi_hyouzi(f);
}

void main(){
	mozi_setuzoku();
}

このようにして実現してみましたが、いかんせん納得がいきません。
というのは、mozi_setuzoku関数の中にmozi_hyouzi関数を入れてしまったからです。このようにせず、main関数の中に2つの関数があるように、グローバル変数を排除することは不可能でしょうか?

よろしくお願いします。

Re: グローバル変数をつかわない

Posted: 2011年6月24日(金) 21:36
by h2so5
char f[5]; をmain関数内に入れて、
引数経由でmozi_setuzokuとmozi_hyouzi関数に渡したらどうでしょうか?

Re: グローバル変数をつかわない

Posted: 2011年6月24日(金) 21:58
by IM
お返事ありがとうございます。
私自身それは考えたのですが、どうも/* ? */の部分がわからないのです。あるいはそれ以外でしょうか?

コード:

#include <stdio.h>
 
void mozi_hyouzi(char *f){
    printf("fは\"%s\"です",f);
}
 
void mozi_setuzoku(char *f){
    char c[3]="ab";
    char b[3]="cd";
    /* ? */
}
 
void main(){
    char *f={0};
    mozi_setuzoku(f);
    mozi_hyouzi(f);
}

Re: グローバル変数をつかわない

Posted: 2011年6月24日(金) 22:10
by 初級者
こんな風に書いてみました。もし参考になったらうれしいです。

コード:

#include <stdio.h>

void mozi_setuzoku(char *dest, char *src0, char *src1)
{
    sprintf(dest, "%s%s", src0, src1);
}

void mozi_hyouzi(char *c)
{
    printf("%s\n", c);
}

int main(void)
{
    char a[] = "ab";
    char b[] = "cd";
    char c[100];

    mozi_setuzoku(c, a, b);
    mozi_hyouzi(c);
    return 0;
}

Re: グローバル変数をつかわない

Posted: 2011年6月25日(土) 13:48
by non
IM さんが書きました:お返事ありがとうございます。
私自身それは考えたのですが、どうも/* ? */の部分がわからないのです。あるいはそれ以外でしょうか?

コード:

#include <stdio.h>
 
void mozi_hyouzi(char *f){
    printf("fは\"%s\"です",f);
}
 
void mozi_setuzoku(char *f){
    char c[3]="ab";
    char b[3]="cd";
    /* ? */
}
 
void main(){
    char *f={0};
    mozi_setuzoku(f);
    mozi_hyouzi(f);
}
まず、文字列を格納するための領域を確保しなくてはいけません。
> char *f={0};
これでは、領域を確保したことにはなりません。
char f[100]={0}; のように十分な領域を確保します。ポインタでは、領域を確保できません。
また、少し難しくなりますが、mallocなどの関数を使って、動的に確保することもできます。

/* ? */の部分は、sprintfでも大丈夫です。