2014-11-24 138 views
0

我有一個程序讀取文件的內容並將其保存到buf中。閱讀完內容後,它應該將兩個字符複製到一個數組中。如果我不試圖從文件讀取,但如果我嘗試從文件中讀取它,緩衝區中的printf會打印出我想要的兩個字符,但會添加奇怪的字符,此代碼正常工作。我已經確認,它正確保存到buf中,沒有奇怪的字符。我無法弄清楚什麼是錯的......下面的代碼:打印奇怪字符的C程序

char *buffer = (char*)malloc(2*sizeof(char)); 
char *dst = buffer; 
char *src = buf; 
char *end = buf + strlen(buf); 
char *baby = '\0'; 
while (src<= end) 
{ 
    strncpy(dst, src, 2); 
    src+= 2; 
    printf("%s\n", buffer); 
} 
+0

嘗試分配'3 * sizeof(char)'而不是'2 * sizeof(char)'(+1爲'\ 0'),並且不要忘記在'緩衝區' – 2014-11-24 10:42:07

回答

1
  1. (char*)malloc(2*sizeof(char));變化malloc(3*sizeof*buffer);你需要一個額外的字節來存儲它是用來表示end-of-string終止空字符。另外,請不要輸入malloc()的返回值。 由於放鬆

  2. 在你的情況下,strncpy(),您提供的n2,這是沒有任何範圍存儲終止空字節。沒有trminating null,printf()將不知道在哪裏停止。現在,3個字節的內存,你可以使用strcpy()複製串正確

strncpy()添加終止空本身,以防n等於提供的緩衝區的大小,從而成爲非常非常不可靠(不像strcpy())。您需要以編程方式處理它。

查看strncpy() and strcpy()的手冊頁。

+0

Omg,非常感謝你!它的工作 – ninjacow55 2014-11-24 10:49:36

+0

@ user3760729很高興聽到這一點。如果這解決了您的問題,您可以考慮「接受」 - 通過點擊帖子左上角的「tick」來輸入此答案。 – 2014-11-24 10:51:15

+0

[不建議在C]中建立'malloc()'的返回值(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。另外,如果可能的話,'strncpy()'會添加終止,但並不總是這會使其變得棘手並且不可取。 – unwind 2014-11-24 10:53:16