2017-03-28 23 views
0

私は文字列を使っていくつかのことをする関数を持っていますが、元の文字列をchar配列にコピーして保存しなければなりません。奇妙な値を返すprintf( "%s")

belfast: BELFAST 
please: PLEASE 
aardvark: AARDVARK?? 
hello world: HELLO VORLD 
taxxxiii: TAXXXIII??? 
swag: SVAG? 

それはなぜ:任意のW/W V.

char* function(const char* text){ 

    int textLength = strlen(text); 
    char text_copy[textLength]; 

    for(int i = 0; i < textLength; i++){ 
    if(text[i] == 'W' || text[i] == 'w') 
     text_copy[i] = 'V'; 
    else 
     text_copy[i] = toupper(text[i]); 
    } 

    return 'a'; 
} 

のために、本当に、私はいくつかの文字列で、printf("%s\n", text_copy);にしようとするたびに関数が戻るが、しかし、それはこれを返すかは重要ではありませんいくつかの文字列はうまくいき、ある文字列はうまくいきませんありがとう。

+6

'text_copy'はローカルスコープを持ち、ヌルターミネーションではないため、ヌルターミネータのためのスペースはありません.... – LPs

+0

出力に疑問符が表示されるのか、期待どおりの方法で処理されている文字列をマークするには? – Codor

+0

@LPs 'text_copy'を' textLength + 1'に設定し、 'text_copy [textLength] = '\ 0';'が問題を解決したようです。ありがとう! – Holsen

答えて

3

あなたはコピーをヌルで終了する必要があります...ので、同じようにコードを変更し

char text_copy[textLength+1]; 
... 
text_copy[textLength]='\0'; 

あなたの関数から関数を返すのであれば(明らかではありませんが)、代わりにそれをmallocする必要があります。

+0

ありがとう。それは関数から返されるはずではありませんが、ヘッドアップのおかげで! – Holsen

1

なぜ一部の文字列がうまくいくのですか?

純粋なチャンス。

文字列に表示される文字にはenoufghスペースしか割り当てられません。終端文字は\0ではありません。いくつかの文字列では、文字配列の直後にヌルバイトがスタック上にあるのは幸いです。

int textLength = strlen(text); 
char text_copy[textLength + 1]; // << enough space for the strings and \0 

for(int i = 0; i < textLength; i++){ 
    if(text[i] == 'W' || text[i] == 'w') 
    text_copy[i] = 'V'; 
    else 
    text_copy[i] = toupper(text[i]); 
} 
text_copy[textLength] = '\0'; // Make sure it is terminated properly. 
+0

' text_copy'は自動的に記憶域を持ち、関数は 'char *'を返します.... – LPs