实施';cat&x27;在c-wwwmc中?(我的代码有什么问题)

实施';cat&x27;在c-wwwmc中?(我的代码有什么问题),c,segmentation-fault,fputs,C,Segmentation Fault,Fputs,我的代码在某种程度上运行良好。不过我有两个问题。第一,在将文件打印到标准输出的最后,它给了我一个分段错误 第二,我不能使用FPUT打印数据,因为我马上就遇到了分段错误。因此,为了修复它,我使用了puts,它可以很好地打印文本,但在每行之后添加一个“\n”,使文本单行隔开,并在末尾添加seg错误 #include <stdio.h> #include <string.h> void concat(char *arg){ char string[256];

我的代码在某种程度上运行良好。不过我有两个问题。第一,在将文件打印到标准输出的最后,它给了我一个分段错误

第二,我不能使用FPUT打印数据,因为我马上就遇到了分段错误。因此,为了修复它,我使用了puts,它可以很好地打印文本,但在每行之后添加一个“\n”,使文本单行隔开,并在末尾添加seg错误

#include <stdio.h>
#include <string.h>

void concat(char *arg){

    char string[256];
    FILE *fp = fopen(arg, "r");

    while(!feof(fp)){
        fgets(string, 256, fp);
        //fputs(string, fp);
        puts(string);
    }

    fclose(fp);

}

void stdincat(){

    char string[256];   
    while(!feof(stdin)){
        fgets(string, 256, stdin);
        fputs(string, stdout);
    }
}

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

    char argvalues[256][40];

    if(argv[1] == NULL)
        stdincat();
    else if(argv[1] != NULL){
        int i;

        for(i=1;i<=(argc);i++){
            concat(argv[i]);
        }
    }

    return 0;
}
#包括
#包括
void concat(字符*arg){
字符串[256];
文件*fp=fopen(arg,“r”);
而(!feof(fp)){
fgets(字符串,256,fp);
//fputs(字符串,fp);
放置(字符串);
}
fclose(fp);
}
void stdincat(){
字符串[256];
而(!feof(stdin)){
fgets(字符串,256,标准输入);
FPUT(字符串、标准输出);
}
}
int main(int argc,char*argv[]){
字符argvalue[256][40];
如果(argv[1]==NULL)
stdincat();
else if(argv[1]!=NULL){
int i;

因为(i=1;i您在
concat
中注释掉的对
fputs
的调用正试图写入
fp
,而您打开它只是为了阅读,所以它不起作用/不起作用也就不足为奇了

除此之外,您的读取循环:
while(!feof(fp)){
(除了从
stdin
而不是
fp
)遵循一种常见的、普遍存在的反模式——这样的循环不会/不会/不能正常工作。您通常希望在同一操作中读取和测试成功:

while(fgets(string, 256, stdin))
    fputs(string, stdout);
编辑:我还应该提到,我更愿意避免
concat
stdincat
中的代码重复。我宁愿将要读取的
文件*
作为参数传递,因此您可以使用相同的代码从
stdin
或其他任意文件中读取:

// Warning: untested code.
// error checking omitted for readability.
void catfile(FILE *file) { 
    char line[256];
    while (fgets(line, sizeof(line), file))
        puts(line);
}

int main(int argc, char **argv) { 
    int i;
    if (argc == 1)
        catfile(stdin);
    else for (int i=1; i<argc; i++) {
        FILE *infile = fopen(argv[i], "r");
        catfile(infile);
        fclose(infile);
    }
    return 0;
}
//警告:未测试的代码。
//为可读性而忽略错误检查。
无效catfile(文件*文件){
字符行[256];
while(fgets(行、sizeof(行)、文件))
放(线);
}
intmain(intargc,字符**argv){
int i;
如果(argc==1)
catfile(stdin);

对于(int i=1;i您不能在仅为读取而打开的流上写入,您应该在函数concat中为FPUT使用stdout

谢谢!fgets问题只是盲编码。令人尴尬的是,我没有看到……现在一切都正常了。谢谢!