2017-02-04 192 views
0

這是代碼。它必須具有void main()之前的部分,因爲它是我被告知代碼的要求。void strcopy之後的東西需要保留到void main()。將一個字符串複製到另一個字符串的程序,其中包括打印奇怪字符

#include <stdio.h> 


void strcopy(char * string1, char * string2) 
{ 
    int i = 0; 

    while (string1[i] != '\0') { 
     string2[i] = string1[i]; 
     i++; 
    } 
    return; 
    /* copies string1 to string 2 */ 
} 

void main() 
{ 
    char string1[1000], string2[1000]; 
    int i; 


    printf("Enter the string: \n"); 
    scanf("%[^\n]s", string1); 

    printf(" %s ", string2); 

    return; 
} 

這是什麼正在打印,我很難過。有人可以幫我嗎?

Enter the string: 
hello 
t��\� 

感謝

+2

你永遠不會調用'strcopy()',所以'string2()'是未初始化的。 – Barmar

+1

應該使用'scanf(「%999 [^ \ n] s」,string1);'而不是爲了防止緩衝區溢出。 – RoadRunner

回答

1

首先,你不叫strcopy,讓您打印只是string2未初始化的內容。其次,在strcopy中,您忘記了終止目標字符串(請注意,您的循環會在寫入'\ 0'之前終止)。寫:

void strcopy(char * string1, char * string2) 
{ 
    int i = 0; 

    while (string1[i] != '\0') { 
     string2[i] = string1[i]; 
     i++; 
    } 
    string2[i]='\0'; 
    return; 
    /* copies string1 to string 2 */ 
} 

如果不終止字符串,然後在目標存儲任何字節被視爲「屬於串」,直到達到爲0x0字節。而這些字節可能會產生如此奇怪的輸出。

0

但是你從來沒有打電話給strcopy()

添加函數調用讀取輸入後:

strcopy(string1, string2); 

的其他問題是:

  • main()函數返回int。因此,將定義更改爲:int main(void) {...並返回int值,如return EXIT_SUCCESS;
  • 您尚未將空字節插入目標。您需要它,因爲您使用%s將它打印爲字符串。 while循環後添加string2[i] = 0;
  • scanf()的格式說明符中刪除s%[^\n]就足以讀取換行符。相反,你可能會考慮使用fgets()。因爲您使用的是scanf() - 容易受到緩衝區溢出的影響,並且generally inferior
相關問題