簡體   English   中英

C /從文件到數組的字符串數據。 分段故障

[英]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;
}

  1. 截至目前,您正在使用char數組

    您需要的是

      char tab[BUFFER]; --> char tab[BUFFER][SOME_LENGTH]; 

      fscanf(wp, "%s", &tab[i]); --> fscanf(wp, "%s", tab[i]); 
  2. %s期望null終止的char *但您正在傳遞char

      printf("%s\\n", tab[i]); 
  3. 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.
intfloat變量類型不同, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM