gpt4 book ai didi

c - 线计数和异常结果

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:32 25 4
gpt4 key购买 nike

我正在编写一个实用程序来通过 Unix 命令行计算给定文件中的行数。通常这对我来说非常简单,但显然我正在度过一个重要的休息之夜。该程序的目标是从命令行获取未知数量的文件,将它们读入缓冲区并检查换行符。听起来很简单?

int size= 4096;

int main(int argc, char *argv[]){
int fd, i, j, c, fileLines, totalLines;
char *buf= (char *)malloc(size); //read buffer

for (i=2; i<argc; i++){ //get first file

fileLines=1;

if ((fd=open(argv[i], O_RDONLY))!= -1){ //open, read, print file count, close
while ((c= read(fd, buf, size))!= 0){

for (j=0; j<size; j++){
if (buf[j] == '\n')
fileLines++;
}
}

}
printf("%s had %d lines of text\n", argv[i], fileLines);
totalLines+= fileLines;
close(fd);

}

printf("%d lines were counted overall\n", totalLines);
return 0;
}

我有两个问题。首先是第一个 printf 语句永远不会在调试器之外执行。第二件事是 totalLines 打印输出应该大约为 175K 行,但打印值大约是 767 倍。

我很难理解这一点,因为所有相关变量都已声明超出其修改的范围,但这仍然不能解释为什么在调试器之外忽略第一个打印语句和行计数器更新以及异常的 totalLines 结果

感谢任何帮助。

回答

建议进行两项更改。
第一个是改变 j<sizej<c .虽然这不是所需的解决方案,但它遵循良好的编码约定

第二个是改变i=2i=1 .我拥有原始启动变量的原因是我启动调试器可执行文件的方式。在 gdb 命令行中,我输入了 run lc1 f1.txt启动调试器。这导致 arglist 具有三个变量,而我不知道 run f1.txt非常合适,因为我的教授使用第一个示例向我们介绍了 gdb。

最佳答案

你没有初始化 totalLines .您在循环内递增它,但在第一次声明它时没有将它设置为 0。

还有,为什么从i=2开始?这是第三个命令行参数,也是程序的第二个参数。这是您想要的,还是您想从程序的第一个参数开始?

正如其他人指出的那样,您应该有 j < c而不是 j < size .

关于c - 线计数和异常结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5891838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com