以下代码可以编译,没有错误或警告,我也可以执行该程序,并且它将按预期方式运行,因为它将在预期的位置返回错误消息,例如,为不存在的文件提供参数。这让我知道代码可以运行到第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
从
test
到test2
,所以它看起来像"ting"
"test"
"123"
谢谢,不确定要提供多少信息。
最佳答案
您的代码有很多问题,在启用所有警告的情况下进行编译会发现其中的一些问题:
在头文件中声明全局变量是一种好习惯,但不要在其中定义它们。 extern
关键字用于声明。这些定义属于C文件。在这种情况下,应将诸如fp
,fp1
,line
之类的变量定义为局部变量,而不是全局变量。
输出文件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/