gpt4 book ai didi

C - 打开/读取垃圾箱

转载 作者:行者123 更新时间:2023-11-30 20:11:00 25 4
gpt4 key购买 nike

我正在做一个简单的 C 版本的 cat。

一切正常,但当我执行 prinf 时,它会附加一些垃圾。

那是什么/为什么?

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char *argv[]) {

FILE *fp;
int i,n;
char ch;
int f;
char buffer[1024];

//nao foi especificado nenhum ficheiro
if(argc<2){
printf("usar mycat <ficheiro> \n");
return 0;
}

for(i=1; i<argc;i++){
//fp = fopen(argv[i],"r");
f = open(argv[i], O_RDONLY);
//Nao existe ficheiro
//if(f == NULL) {
if(f == -1) {
printf("%s: Nao existe esse ficheiro\n", argv[i]);
return 0;
}

/*
while((ch=fgetc(fp)) != EOF){
putchar(ch);
}
*/
while((n=read(f,buffer,1024)) > 0) {
printf("%s",buffer);
}
//fclose(f);
close(f);

}

return 1;
}

忽略被注释的fopen代码。

最佳答案

来自 read 的缓冲区不是以 null 终止的,并且不能用 printf("%s", buffer) 打印,因为当字符串对应时,行为未定义到 %s 不是以 null 结尾的。

一种选择是拥有 1024 + 1 个字符的缓冲区:

char buffer[1024 + 1];

然后读入1024个字符

n = read(f, buffer, 1024)

并将其零终止:

buffer[n] = 0;
<小时/>

但是 Unix 工具经常处理输入中的空字符,在这种情况下没有理由不这样做,因此您可以使用 fwritewrite 来编写这些字符例如 n 字节

fwrite(buffer, 1, n, stdout);

write(STDOUT_FILENO, buffer, n);

关于C - 打开/读取垃圾箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42460532/

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