2016-07-29 91 views
-2

我試圖運行這個簡單的代碼ç怪異的字符串輸出

#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

當您聲明已滿時,它可能已經在內存中有值。由於您沒有將所有值設置爲零,因此strcat會將名字連接到結尾。您需要將第一個名稱複製到全名。我會查找strncpy或strcpy,因爲這可能是一些有用的功能(我會用strncpy來防止用覆蓋來破壞內存。 – Glenn

回答

4

full沒有初始化,

strcat(full, first);調用未定義的行爲。

垃圾內容是一種不確定行爲的溫和形式。

您應該改用:

strcpy(full, first); 

或者更好:

#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; 
} 

注意full最有可能包含一個尾隨換行。

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); 
}