2013-02-11 13 views
-1

我正在寫這個函數,它將n個字符從s2複製到s1中。如果s2的長度比n短,其餘的n個字符將由空字符組成。將空字符複製到字符串中時,空仍然被打印爲垃圾

main() 
{ 
    char sourceStr[10]; 
    char destStr[80]; 
    int myInt; 

    printf("Enter a string: "); 
    gets(sourceStr); 

    printf("Enter the number of characters: "); 
    scanf("%d", &myInt); 

    printf("Returned string: %s ", copyastring(destStr, sourceStr, myInt)); 
    return 0; 

} 

char *copyastring(char * s1, char * s2, int n) 
{ 

    int a = n; 
    for(n ; n > 0 ; n--) 
    { 
      // if end of s2 is reached, the rest of s1 becomes null 
     if(*s2 == '\0') 
     { 
      while(n > 0) 
      { 
       *s1 = '\0'; 
       s1++; 
       n--; 
      } 
      break; 
     } 
      //if-not, copy current s2 value into s1 
      //increment both pointers 
     else 
     { 
      *s1 = *s2; 
      s2++; 
      s1++; 
     } 
    } 
    // Just incase s2 is longer than n, append a null character 
    s1++; 
*s1 = '\0'; 
s1--; 

    //Reset s1's pointer back to front of s1 
    s1 = s1 - a; 
    return s1; 
} 

運行該代碼,並打印出由該函數返回字符串後,我發現所有的空字符打印爲亂碼(不可讀)。爲什麼?不是空字符終止字符串?

在此先感謝

+2

如何打印函數返回的字符串? – 2013-02-11 12:51:14

+4

字符串是如何聲明的以及如何調用函數? – cnicutar 2013-02-11 12:51:37

+0

你確定's1'被分配到足夠大的尺寸嗎?與這個問題無關,但是你認爲''for'語句中有什麼''n'' – 2013-02-11 12:56:11

回答

1

末尾添加一個空結束如果s2n字符那麼你就沒有終止字符串添加s1如此,將返回的指針作爲字符串打印將產生垃圾。

+0

好的。現在我編輯了代碼,最後還是看到了一個單一的garbabe字符。 – kype 2013-02-11 13:03:59

+0

@ user1234897你不必做最後一次增加's1',它已經在循環的'else'語句中完成了。這實際上會讓終結者超出字符串的末尾。 – 2013-02-11 13:13:41

+0

唉,這是一個白癡錯過了。謝謝你正確地工作 – kype 2013-02-11 13:17:52

0

呼叫至copyastring其中myInt < strlen(sourceStr)將無法​​添加一個空終止TP destStr。然後,您將打印destStr其餘部分出現的任何數據加上隨後的堆棧,只有在程序崩潰或遇到零字節時纔會終止。

一個簡單的辦法解決,這將是永遠在copyastring

s1 = s1 - a; 
s1[n-1] = '\0'; 
return s1; 
+3

是不是更適合評論? – 2013-02-11 12:52:14

+0

@IvayloStrandjev雖然它的th e只有明顯的缺陷,我可以在代碼中看到,所以我猜這就是答案 – simonc 2013-02-11 12:53:43

+0

如果沒有足夠的信息來找到答案,那麼這個問題就不能回答,就這麼簡單。 – Lundin 2013-02-11 12:54:37