爲什麼下面的代碼在運行時突然退出而不打印任何輸出???C程序中的fgets突然退出
FILE *file;
file=fopen("filename","r");
char *line;
while (fgets(line,1000,file)!=NULL) {
int i=0;
int l=sizeof(line);
printf("%d\n",l);
}
爲什麼下面的代碼在運行時突然退出而不打印任何輸出???C程序中的fgets突然退出
FILE *file;
file=fopen("filename","r");
char *line;
while (fgets(line,1000,file)!=NULL) {
int i=0;
int l=sizeof(line);
printf("%d\n",l);
}
char *line;
這是一個字符指針,沒有指向任何內存..
fgets(line,1000,file)!=NULL
,在這裏你試圖保存,你從它file
讀取的字符串,不分配內存它
糾正,在你做fgets()
做malloc()
來分配內存
line = malloc(1000);
,或者聲明line
變量作爲字符數組,這樣
char line[1000];
@harris非常感謝,但是仍然爲每行打印4,即使在我的文件中沒有行的長度爲4 – Joker 2014-10-26 17:32:36
因爲sizeof並不是要測量字符串長度。使用strlen。 – deviantfan 2014-10-26 17:33:30
你的節目說:讀了一堆數據出來的文件,並把它寫在程序的任意部分內存(堆棧,堆,代碼,無論什麼......)。不是一件好事。
一種方法來解決,改變char *line
到char line[1000+1]
沒有必要在這裏使用指針或動態分配。
第二個錯誤,引用指針時不要使用sizeof(line)
。它不像你想象的那樣工作。 strlen(線)更合適。通常,您最好使用常用常量來分配緩衝區大小並從文件中讀取。
const int MAXLINESIZE = 1000;
char line[MAXLINESIZE+1];
fgets(line, MAXLINESIZE, file)
注意讀取數組大小的新安全方式。這隻會讀取一個數組,所以你會知道它是一個數組而不是指針。其內置的安全功能。
#include "stdlib.h" // _countof() definition location
// unlike sizeof, _countof works here for both narrow- and wide-character strings.
_TCHAR arr[20], *p;
//sizeof(arr) = 40 bytes
//_countof(arr) = 20 elements
// In C++, the following line would generate a compile-time error:
// printf("%d\n", _countof(p));
// error C2784 (because p is a pointer)
你可以看到_countof(數組名)是一個更好的選擇,如果你打算使用C.此外,它不是由寬字符影響;返回數組中正確數量的元素,與sizeof()不同。
1000從哪裏來?換句話說,應該保存行數據的1000個字符在哪裏?你只有一個未初始化的指針指向任何合法的地方。 – 2014-10-26 17:23:56
@MOehm這是我的代碼的一部分,文件是流的文件,它有多個lines.Each行可以有1000字符的最大 – Joker 2014-10-26 17:25:16
是的,我可以看到你的意圖,但你需要將行存儲在一個數組,所以你需要'char line [1000]'。這會給你1000個字符來存儲該行。 (或者像Haris所建議的那樣保留'char * line'和'malloc',但是之後你必須'free'')'fgets'不會爲你自動分配內存。 – 2014-10-26 17:27:06