2016-11-14 11 views
-1

関数からchar配列を返そうとしました。私はC言語で新しく、関数の戻り値を学習しようとします。私はプログラムを動作させることはできません戻り値文字配列C

int main() 
{ 
unsigned int nr; 
unsigned int mask=32; 

char *outString; 

printf("Enter Nr:\n"); 
scanf("%u",&nr); 

outString = getBinary(nr,mask); 
printf("%s",outString); 
//getch(); 
return 0; 
} 

char * getBinary(int nr,int mask) 
{ 
static char outPut[sizeof(mask)]=""; 
while(mask>0) 
{ 
if((nr&mask)==0) 
    { 
     strcat(outPut,"0"); 
    } 
    else 
    { 
     strcat(outPut,"1"); 
    } 
    mask=mask>>1; 
    } 

//printf("%s",outPut); 
return outPut; 
} 

: これは私のコードです!関数呼び出しに2つのエラーがあります。

+1

どのようなエラーが表示されますか? –

+0

関数の暗黙の宣言。そして代入は、キャスト外のポインタromの整数を作る。 –

+3

'main *'の前に 'char * getBinary(int nr、int mask);'というプロトタイプを入れてみてください。 – artm

答えて

0

おかげで、私の問題は、メインの前に、関数のプロトタイプを追加することで解決しました。配列のサイズについて[sizeof()]これはテストのためのものです。リアルタイムのコードでは、より多くのalloc()が多くのバッターであると思っていました。

2

大きな問題は、sizeof(mask)はあなたが思っていることをしていないということです。これは、sizeof(int)に相当します。これはあなたが望むものではありません。

この目的のためにポインタとメモリアロケータ機能を使用することをお勧めします。

FYI、現在sizeofとして

static char outPut[sizeof(mask)] ""; 

の問題が表示されていないと、コンパイル時のオペレータであるので、このoutPutはVLAではありません。すぐに

static char outPut[mask] = ""; 

に変化にそれを試してみてくださいとして、あなたは問題に直面するだろう、

  • のVLAはローカルスコープと不完全な型であるため、staticストレージが許可されていません。
  • VLAを初期化することはできません。

また、main()の後に定義する場合は、プロトタイプ(前方宣言)をgetBinary()に指定する必要があります。

+0

ローカル変数(配列) 'outPut'は静的であってもUBにつながるのですか? – Gopi

+1

彼は、' getBinary() '関数のプロトタイプを持っていません。 – Gopi

+0

@Gopi大きなものがある、隠されている、 –

0

次のようにプログラムを変更することができます。すべての答えを

#include <stdio.h> 
#include <string.h> 
char * getBinary(int nr,int mask); // add function header, it necessary to avoid compilation error 
//otherwise you can move getBinary function before your main function, because the compilator cannot recognize your function when it is defined after the call. 
int main() 
{ 
unsigned int nr; 
unsigned int mask=32; 

char *outString; 

printf("Enter Nr:\n"); 
scanf("%u",&nr); 

outString = getBinary(nr,mask); 
printf("%s",outString); 
//getch(); 
return 0; 
} 

char * getBinary(int nr,int mask) 
{ 
static char outPut[sizeof(mask)]=""; 
while(mask>0) 
{ 
if((nr&mask)==0) 
    { 
     strcat(outPut,"0"); 
    } 
    else 
    { 
     strcat(outPut,"1"); 
    } 
    mask=mask>>1; 
    } 

//printf("%s",outPut); 
return outPut; 
}