C-打开/读取放入垃圾桶

C-打开/读取放入垃圾桶,c,C,我正在做一个简单的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]; //na

我正在做一个简单的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;
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
文件*fp;
inti,n;
char ch;
int f;
字符缓冲区[1024];
//我特别喜欢你

如果(argc读取的缓冲区不是以null结尾的,并且不能用
printf(“%s”,buffer)
打印,因为当与
%s
对应的字符串不是以null结尾时,行为是未定义的

一个选项是使用1024+1个字符的缓冲区:

char buffer[1024 + 1];
然后读入1024个字符

n = read(f, buffer, 1024)
零终止它:

buffer[n] = 0;

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

fwrite(buffer, 1, n, stdout);


请理解这是什么意思-这意味着您需要在发布问题之前删除所有不必要的代码和注释。至于错误,
read
返回一个不以0结尾的字符串,因此您不能将其与
printf(“%s”)
;将printf替换为
write(1,buffer,n);
例如。@AnttiHaapala 1是标准输出吗?其他选项应该是将和\0添加到缓冲区?
write(STDOUT_FILENO, buffer, n);