C-读取多个文件流

C-读取多个文件流,c,segmentation-fault,filestream,C,Segmentation Fault,Filestream,我正在编写自己的经典UNIX程序“wc”(字数统计)的简化版本。它计算行数、字数和字符数。所有这些功能都可以正常工作。但我遇到的麻烦是当我试图从*argv[x]读取多个文件时。我需要将每个变量放入一个数组,并通过循环运行整个过程,以实现我想要的 我的程序返回一个分段错误。在代码中的某个点上,没有将某些内容分配到数组中,而我似乎无法准确地找出这些内容的位置 非常感谢您的帮助:) /* *[程序]wc(字数) *[作者]Jesper M.Olsen@jm0.code *[日期]2015年9月9日 *

我正在编写自己的经典UNIX程序“wc”(字数统计)的简化版本。它计算行数、字数和字符数。所有这些功能都可以正常工作。但我遇到的麻烦是当我试图从*argv[x]读取多个文件时。我需要将每个变量放入一个数组,并通过循环运行整个过程,以实现我想要的

我的程序返回一个分段错误。在代码中的某个点上,没有将某些内容分配到数组中,而我似乎无法准确地找出这些内容的位置

非常感谢您的帮助:)

/*
*[程序]wc(字数)
*[作者]Jesper M.Olsen@jm0.code
*[日期]2015年9月9日
*[PURPOSE]返回文件中的行数、字数和字符数
*
*[说明]此程序旨在用作一个方便的小浏览工具。
*例如,当在编程归档文件系统中移动时,
*只需键入“wc”,您将立即返回行数、字数和字符数。
*/
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc==1)
返回-1;
int numL[argc];/*初始化数组值占位符*/
int numW[argc];
int numC[argc];
int-getC[argc];
int getW[argc];
int setNull;
对于(setNull=1;setNull我认为问题可能是
这里-

因为数组可以
argc
元素的数量,但是在这个循环中,您在
getC
中读取和存储的整数可能多于
argc
。因此会出现Seg故障

但我们不知道文件里有什么我们不能确定

尝试增加数组的大小


注意-最好从索引
0
开始初始化数组。在此代码中,您没有使用索引
0

这将在到达最后一个文件时导致segfault

FILE *fOp[argc-1];

for (x = 1; x <= argc-1; x++) { /* open file stream for each file */
    fOp[x] = fopen(argv[x], "r");
    if (fOp[x] == NULL)
        return -1;
}
如果您使用

< argc
而不是

<= argc-1

注意-您从未在代码中使用任何数组的索引
0
。请附加调试器回溯输出,以便我们知道segfault位于哪一行。
文件*fOp[argc-1];
应该是
文件*fOp[argc]
我也更喜欢看到
而不是
,因此加载调试器并调试程序。代码试图对一个文件执行
wc
操作,并试图对多个文件执行该操作。如果单个文件的
wc
参数集合在子函数中。将文件名从
main()中的循环一次传递给子函数
一般来说,代码会简单得多,因为数据变量是单个实例而不是数组。另外,从用户的角度来看,行/字符/单词信息输出到哪里并不重要,所以输出子函数中的每一行。@ameyCU,不,他正在用
argc-1
eleme索引数组我猜他没有使用索引
0
,因为他对
argv[0]不感兴趣
怎么办?他没有使用它。哦,我的坏家伙被搞糊涂了。你刚才说的是
argv
。我在运行一些测试后发现了seg故障,果然。它被放在了你描述的for循环中。^^。这是一个逻辑错误,当然产生了一个错误。我只是在for循环中放了一段时间,所以它会计算每个f我不知道文件中有什么,所以我不太确定。但是你的代码现在运行得很好。干杯!!@Jesperlsen我先是很惊讶,但现在仔细看一下
y
在之前的
for循环中没有限制,因为它会使索引超出限制因为错误。
FILE *fOp[argc];
< argc
<= argc-1