C /从文件到数组的字符串数据。分段故障

时间:2019-05-24 12:07:41

标签: c arrays stream

我正在编写一个程序,该程序从文本文件流式处理单词并将其放入数组中。我还添加了一个数组数据显示,以查看是否一切正常,但编译后出现分段错误。

我是系统编程的新手,所以我知道我可能犯了一些基本的错误。请找到下面的代码,并告诉我我哪里出错了。

#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;
}

3 个答案:

答案 0 :(得分:2)

  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]))
      {
             ...
      }
    

答案 1 :(得分:1)

本节:

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.
intfloat变量类型不同,char数组的名称(即tab)已经是一个指向变量地址的指针,因此不需要(和错误)使用 运算符(&)的地址。

与上述内容相关... (可能是分段错误的原因。)
因为tab的定义是一个简单的charchar tab[BUFFER];)数组,所以符号tab[i]仅指第i个byte(或{{1 }}),而不是整个数组。由于使用了char格式说明符,因此函数 fscanf() 期望使用"%s"而不是char *,从而使char是正确的参数使用。

如果要使用行数组,则必须将变量创建为char的 2D 数组:

tab

在语句#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++) {

将等于指针sizeof(wp)的字节数,根据应用程序的目标地址为32或64。这可能不是您想要的。 (或想要)。

考虑另一种方法:
如果您正在使用文本文件,请尝试结合使用wp fgets() 从文件中读取行。然后,您可以根据其已知语法来处理每一行。
(以下示例使用一维while()数组进行简化说明。)

char

答案 2 :(得分:0)

sizeof(wp)是问题所在。 sizeof返回以字节为单位的类型的长度,而不是文件的长度。

如果您想获取文件大小,this可能会对您有所帮助。