2016-07-29 16 views
-2

た私は、この単純なコードC奇妙な文字列出力

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

int main() { 
    char first[20]; 
    char last[20]; 
    char full[40]; 

    printf("Your first name?: "); 
    fgets(first, sizeof(first), stdin); 
    printf("your last name?: "); 
    fgets(last, sizeof(last), stdin); 
    first[strlen(first) - 1] = '\0'; 
    strcat(full, first); 
    strcat(full, " "); 
    strcat(full, last); 
    printf("Your full name is: %s", full); 
} 

を実行しようとした出力が返される。..

Your first name?: Daniel 
your last name?: Jee 
Your full name is: pA▒Daniel Jee 

誰もこれが何であるかを教えてもらえますか?

+2

デバッガはあなたに何を伝えましたか? –

+1

完全であると宣言すると、すでにメモリに値がある可能性があります。すべての値を0に設定しなかったので、strcatは最初の名前を最後に連結します。最初の名前をフルネームにコピーする必要があります。 strncpyまたはstrcpyを参照すると便利な機能がいくつかあります(strncpyを使って上書きしてメモリを破壊することはありません)。 – Glenn

答えて

4

fullが初期化されていない、

strcat(full, first);は未定義の動作を呼び出します。

ごみの内容は、未定義の動作の軽い形式です。

あなたは代わりに使用する必要があります。

strcpy(full, first); 

またはそれ以上:fullが最も可能性の高い末尾に改行が含まれていることを

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

int main(void) { 
    char first[20]; 
    char last[20]; 
    char full[40]; 

    printf("Your first name? "); 
    if (!fgets(first, sizeof(first), stdin)) 
     return 1; 
    printf("your last name? "); 
    if (!fgets(last, sizeof(last), stdin)) 
     return 1; 
    first[strlen(first) - 1] = '\0'; 
    snprintf(full, sizeof full, "%s %s", first, last); 
    printf("Your full name is: %s", full); 
    return 0; 
} 

注意を。

2

Cのスタック変数は初期化されません。最初にfull[0]=0;を設定せずにstrcat(full, first);を実行しました。

1

代わりに、おそらく最初の文字列をフルにコピーする必要があります。

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

int main() 
{ 
    char first[20]; 
    char last[20]; 
    char full[40]; 

    printf ("Your first name?: "); 
    fgets(first, sizeof(first), stdin); 
    printf("your last name?: "); 
    fgets(last, sizeof(last), stdin); 
    first[strlen(first) - 1] = '\0'; 
    strcpy(full, first); 
    strcat(full, " "); 
    strcat(full, last); 
    printf ("Your full name is: %s", full); 
}