2012-11-15 41 views
1

我正在使用Visual C++ 6.0,並且我有下面的代碼。strcpy不能複製完整的字符串

char filename[1000], string[5]; 
FILE *fin; 
strcpy(filename, argv[3]); 
if ((fin = fopen(filename, "r")) != NULL) 
{ 
    fgets(string, 100, fin); 
    string[strlen(string)-1] = NULL; 
    printf("filename = %s\n", filename); 
    printf("argv[3]= %s\n", argv[3]); 
    printf("string = %s\n", string); 
} 

argv [3]是完整的路徑和文件名,例如, C:\用戶\桌面\ file.txt的,文件的內容是

1 
2 
3 

因此,「1」應該被存儲在「字符串」變量。

然而,持續約1出4個奔跑,我會得到輸出

filename = C:\Users\Desktop\file.tx 
argv[3] = C:\Users\Desktop\file.txt 
string = <very long garbage value> 

爲什麼

strcpy(filename, argv[3]); 

不可複製整個字符串,錯過了最後的 「T」?在這種情況下爲什麼fin不是NULL,因爲該文件不應該存在?

我還應該補充說這個代碼存在於一個多線程程序中,但是隻有一個線程執行這個代碼。

+0

如果您正在使用C++,你爲什麼還在使用'的char [] '和'FILE'而不是'std :: string'和流? – DCoder

+0

我更熟悉char []和FILE。這會有所作爲嗎? – Rayne

+0

是的,它會有的。與大多數其他'std'容器一樣,'std :: string'自動擴展以包含所有放入它的數據,從而使您無需手動跟蹤長度和內存分配。 – DCoder

回答

1
string[5]; 

你只分配足夠的空間,4個字符和一個空結束,但你與fgets是讀多達100

fgets(string, 100, fin); 
+0

是的,但不會fgets也讀取\ n,該文件在「1」之後。無論如何,這條線是在strcpy之後,我相信這是我爲「string」獲得的垃圾值的主要問題。 – Rayne

相關問題