以下代码可以编译,没有错误或警告,我也可以执行该程序,并且它将按预期方式运行,因为它将在预期的位置返回错误消息,例如,为不存在的文件提供参数。这让我知道代码可以运行到第28行(!fpc部分的关闭部分)

意味着必须有一个问题

register int ch, i;


向下

return (1);


之前

printf("\"%s\"\n",line);\


该程序应采用程序名称本身和两个文件名的命令行参数,然后打开这两个文件,然后在添加"时将字符串从第一个文件复制到第二个文件,最大长度为第二个文件。到新文件中字符串的开头和结尾。

我的代码是

fgetline.c

#include "fgetline.h"

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

    if (argc != 3) {
        printf("usage: enquote filetocopy filetowrite \n");
        exit(1);
    }

    fp = fopen(argv[1], "r");
    if (!fp) {
        printf("Couldn't open copy file: (%d) %s\n", errno, strerror(errno));
        return -1;
    }

    fpc = fopen(argv[2], "r+");
    if (!fpc) {
        printf("Couldn't open write file: (%d) %s\n", errno, strerror(errno));
        return -1;
    }

    register int ch, i;

    ch = getc(fp);
    if (ch == EOF)
        return -1;

    i = 0;
    while (ch != '\n' && ch != EOF && i < max) {
        line[i++] = ch;
        ch = getc(fp);
    }
    line[i] = '\0';

    while (ch != '\n' && ch != EOF) {
        ch = getc(fp);
        i++;
    }
    return(i);

    printf("\"%s\"\n",line);

    fclose(fp);
    fclose(fpc);
    return 0;
}


fgetline.h

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

int fgetline(FILE *fp, char *line, int max);
FILE *fp, *fpc;
#define max 30
char line[max + 1];


我正在编译

debian:~/uni/Ass0$ gcc fgetline.c -Wall -o enquote
debian:~/uni/Ass0$ cd /


我做的测试是

debian:~/uni/Ass0$ ./enquote
usage: enquote filetocopy filetowrite
debian:~/uni/Ass0$ ./enquote test
usage: enquote filetocopy filetowrite
debian:~/uni/Ass0$ ./enquote test frog
Couldn't open write file: (2) No such file or directory
debian:~/uni/Ass0$ ./enquote monkey frog
Couldn't open copy file: (2) No such file or directory
debian:~/uni/Ass0$ cat test
ting
test
123

tim@debian:~/uni/Ass0$ cat test2
tim@debian:~/uni/Ass0$ ./enquote test test2
tim@debian:~/uni/Ass0$ cat test2


预期的结果将是当我运行./enquote test test2时,将复制

ting
test
123


testtest2,所以它看起来像

"ting"
"test"
"123"


谢谢,不确定要提供多少信息。

最佳答案

您的代码有很多问题,在启用所有警告的情况下进行编译会发现其中的一些问题:


在头文件中声明全局变量是一种好习惯,但不要在其中定义它们。 extern关键字用于声明。这些定义属于C文件。在这种情况下,应将诸如fpfp1line之类的变量定义为局部变量,而不是全局变量。
输出文件argv[2]应该以"w"模式打开,"r+"用于更新模式,如果文件不存在,则会失败。更新模式非常棘手和混乱,请避免使用它。
不要使用register关键字,因为编译器足够聪明地确定如何最好地使用寄存器,所以现在已经过时了。
您的while循环将从输入文件中仅读取2行,将第一行存储到line数组中,并丢弃第二行。
return (i);语句退出程序,不执行任何输出,该函数中的其余语句被完全忽略(-Wall可能已发现此错误)。


您可以通过考虑以下因素来简化问题:您希望在每行的开头和"的每行末尾之前输出'\n'。您不需要将行缓冲在内存中,这会限制行长。只要在开始一行时和结束一行之前输出"

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

int main(int argc, char *argv[]) {
    FILE *fp, *fpc;
    int ch, last;

    if (argc != 3) {
        printf("usage: enquote filetocopy filetowrite\n");
        exit(1);
    }

    fp = fopen(argv[1], "r");
    if (!fp) {
       fprintf(stderr, "Could not open input file: (%d) %s\n",
               errno, strerror(errno));
        return 2;
    }

    fpc = fopen(argv[2], "w");
    if (!fpc) {
       fprintf(stderr, "Could not open output file: (%d) %s\n",
               errno, strerror(errno));
        return 2;
    }

    last = '\n';  // we are at the beginning of a line
    while ((ch = fgetc(fp)) != EOF) {
        if (last == '\n') {
            fputc('"', fpc);  // " at the beginning of a line
        }
        if (ch == '\n') {
            fputc('"', fpc);  // " at the end of a line
        }
        fputc(ch, fpc);
        last = ch;
    }
    if (last != '\n') {
        // special case: file does not end with a \n
        fputc('"', fpc);  // " at the end of a line
        fputc('\n', fpc);  // put a \n at the end of the output file
    }

    fclose(fp);
    fclose(fpc);
    return 0;
}

关于c - 调试时没有错误或警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38541745/

10-11 21:28
查看更多