2017-02-04 4 views
-1

関数から文字列を渡し、コピーし、他の文字列と連結してmain関数に表示しようとしています。しかし、私は必要な答えを得るためにstrcpyとstrcatコマンドを複製する必要があります。関数から文字列を取得することができず、strcpyとstrcatコマンドの重複を表示しません。

MY警告:

Test1.cに:15:1:警告:関数は、ローカル変数のアドレスを返し[-Wreturnローカル-ADDR]

Test1.cに:22:9:警告:合格「strcpyの」は、引数1、ポインタのターゲットタイプから

/usr/include/string.h:125:14「をCONST」修飾子を破棄します。注:「'* を制限シャア期待が、引数は型であるのconstのchar * '

テスト1.c:23:9:警告: 'strcat'の引き数1がポインターのターゲットタイプから 'const'修飾子を破棄する

/usr/include/string.h:133:14:注:期待される 'char * を制限する 'は、引数の型は 'でのconstのchar *'

Test1.cに:31:3:警告:リターン破棄 'ポインタのターゲット型からのconst' 修飾子

Test1.cに:31:3:警告:関数はローカル変数のアドレスを返す[-Wreturn-local-addr]

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

char *return_string(int number) { 
    char out1[5] = ""; 
    switch (number) { 
     case 1: strcpy(out1, "hi"); break; 
     case 2: strcpy(out1, "how"); break; 
     case 3: strcpy(out1, "are"); break; 
     case 4: strcpy(out1, "you"); break; 
     case 5: strcpy(out1, "?"); break; 
    } 
    return out1; 
} 

char *decimal_to_string (int dec_number) { 
    int num = dec_number; 
    char const final_str[12] = "Hi ", tmp_str[12] = ""; // result  

    strcpy(tmp_str, return_string(num)); 
    strcat(final_str, tmp_str); 
    strcpy(tmp_str, return_string(num)); 
    strcat(final_str, tmp_str); 
    printf("direct return string: %s\n", return_string(num)); 
    printf("return string: %s\n", final_str); 

    return final_str; 
} 

int main() { 
    int num = 3; 
    const char *szSomeString = decimal_to_string(num); 
    printf("%s", szSomeString); 
    return 0; 
} 
+1

ローカル配列 'out1'を返すと、未定義の動作が発生します。 gccのための –

+1

:警告を読んでください:それは便利です。私たちにあなたのコードを手作業でコンパイルしようとするのではなく、あなたの質問に警告を掲示しておけば便利だろう。 –

答えて

1

ローカル変数(out1final_str)へのポインタを返していますが、関数を終了するときにローカル変数は破棄されます。したがって、返されたポインタを使用すると、未定義の動作が発生します。ここで

は、あなたが代わりにそれを行うことができます方法は次のとおりです。

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

const char *return_string(int number) { 
    switch (number) { 
     case 1: return "hi"; 
     case 2: return "how"; 
     case 3: return "are"; 
     case 4: return "you"; 
     case 5: return "?"; 
    } 
    return ""; 
} 

char *decimal_to_string(int dec_number) { 
    char *final_str = malloc(12); // allocate dynamic memory (will not be released on return) 
    strcpy(final_str, "Hi "); 
    char tmp_str[12] = ""; // result  

    strcpy(tmp_str, return_string(dec_number)); 
    strcat(final_str, tmp_str); 
    strcpy(tmp_str, return_string(dec_number)); 
    strcat(final_str, tmp_str); 
    printf("direct return string: %s\n", return_string(dec_number)); 
    printf("return string: %s\n", final_str); 

    return final_str; 
} 

int main(void) { 
    int num = 3; 
    char *szSomeString = decimal_to_string(num); 
    printf("%s", szSomeString); 
    free(szSomeString); // deallocate the allocated memory 
    return 0; 
} 
+0

したがって、関数から文字列を返す必要がある場合は、文字列を直接返すか、動的メモリを使用する必要があります。 – curious

+0

文字列を返す他の方法もありますが、これはあなたの状況に適しています。ローカル変数へのポインタを返さないようにしてください。 – emlai

0

あなたが宣言する可能性がどちらか OUT1(return_string()に)機能外のグローバル変数として、または関数の内部静的として。そうすれば、strcat()(グローバル変数)out1やreturn_string()によって返されたポインタにstrcpy/strcatを避けることができます。

もちろん、そうすることで何かを得ることができますが、ロジックの再入可能性とそれをマルチスレッド化する可能性が失われます。それはロジックを隠していないため、二つの方法(グローバルまたは静的 OUT1)の

は、おそらく世界の一つが優れています。

関連する問題