我正在编写一个程序,该程序从文本文件流式处理单词并将其放入数组中。我还添加了一个数组数据显示,以查看是否一切正常,但编译后出现分段错误。
我是系统编程的新手,所以我知道我可能犯了一些基本的错误。请找到下面的代码,并告诉我我哪里出错了。
#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;
}
答案 0 :(得分:2)
到目前为止,您的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]))
{
...
}
答案 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.
与int
或float
变量类型不同,char
数组的名称(即tab
)已经是一个指向变量地址的指针,因此不需要(和错误)使用 运算符(&
)的地址。
与上述内容相关... (可能是分段错误的原因。)
因为tab
的定义是一个简单的char
(char 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可能会对您有所帮助。