[英]C/ String data from file to array. Segmentation Fault
我正在編寫一個程序,該程序從文本文件流式處理單詞並將其放入數組中。 我還添加了一個數組數據顯示,以查看是否一切正常,但編譯后出現分段錯誤。
我是系統編程的新手,所以我知道我可能犯了一些基本錯誤。 請找到下面的代碼,並告訴我我哪里出錯了。
#include <stdio.h>
#define BUFFER 100
int main() {
char tab[BUFFER];
FILE *wp;
wp = fopen("tab_file_b_words.txt", "r");
if(wp == NULL)
{
printf("error/n");
return -1;
}
int i;
for(i=0; i<sizeof(wp); i++) {
if(wp != NULL)
fscanf(wp, "%s", &tab[i]);
else
break;
}
printf("Content: \n");
for(i = 0; i < BUFFER; i++) {
if(tab[i] != NULL)
printf("%s\n", tab[i]);
else
break;
}
fclose(wp);
return 0;
}
截至目前,您正在使用char
數組
您需要的是
char tab[BUFFER]; --> char tab[BUFFER][SOME_LENGTH];
和
fscanf(wp, "%s", &tab[i]); --> fscanf(wp, "%s", tab[i]);
%s
期望null
終止的char *
但您正在傳遞char
。
printf("%s\\n", tab[i]);
sizeof(wp)
是指針的大小。
for(i=0; i<sizeof(wp); i++)
您需要的是
while (1 == fscanf(wp, "%s", tab[i])) { ... }
這個部分:
for(i=0; i<sizeof(wp); i++) {
if(wp != NULL)
fscanf(wp, "%s", &tab[i]);
else
break;
}
有問題。
首先,該行有兩個問題: fscanf(wp, "%s", &tab[i]);
它應該寫為: fscanf(wp, "%s", tab); //removed & and array notation.
fscanf(wp, "%s", tab); //removed & and array notation.
與int
或float
變量類型不同, char
數組的名稱(即tab
)已經是一個指向變量地址的指針,從而無需(且不正確)使用運算符( &
)的地址 。
與上述...相關(並且可能是分段錯誤的原因。)
因為tab
的定義是針對char
的簡單數組( char tab[BUFFER];
),所以tab[i]
僅指數組的第i個byte
(或char
),而不是整個數組。 由於使用了"%s"
格式說明符,因此函數fscanf()期望使用char *
而不是char
,從而使tab
成為要使用的正確參數。
如果要使用行數組,則必須將變量創建為char的2D數組:
#define NUM_LINES 100
#define LINE_LEN 80
int main() {
char tab[NUM_LINES][LINE_LEN] = {{0}}; // zero initialized array of
// NUM_LINE strings
// each of LINE_LEN-1 capacity
在for(i=0; i<sizeof(wp); i++) {
的語句for(i=0; i<sizeof(wp); i++) {
sizeof(wp)
將等於指針wp
的字節數,根據應用程序的目標地址為32或64。 這可能不是您想要的。 (或想要)。
考慮不同的方法:
如果您正在使用文本文件,請嘗試結合使用while()
和fgets()從文件中讀取行。 然后,您可以根據其已知語法來處理每一行。
(下面的示例使用一維char
數組進行簡化說明。)
char line[some_len];
wp = fopen(some_file_name, "r");
if(wp)
{
while(fgets(line, some_len, wp))
{
// use line. In this case, just print to stdout
printf("%s\n", line);
}
fclose(wp);
}
sizeof(wp)
是問題。 sizeof
返回以字節為單位的類型的長度,而不是文件的長度。
如果要獲取文件的大小, 這可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.