我对 C 编程还很陌生,但我在使用标准输入时遇到了问题。我的代码应该显示输入文件或标准输入中包含的单词数、行数和字符数。如果它显示文件中的数字,则文件名需要位于单词数、行数和字符数旁边,如下所示:
0 0 0 test.txt
我能够做到这一点,但标准输入将不起作用,我得到 “段错误(核心转储)”
enum state
{
START,
WORD,
DELIM,
};
FILE *
input_from_args(int argc, const char *argv[])
{
if (argc == 1){
return stdin;
} else {
return fopen(argv[1], "r");
}
}
void
wcount(FILE *src, FILE *dest, const char *argv[])
{
int ch, wc, lc, cc;
enum state cstate;
wc = lc = cc = 0;
cstate = START;
while ((ch = fgetc(src)) != EOF){
cc++;
switch (cstate){
case START:
if (isspace(ch)){
cstate = DELIM;
if (ch == '\n'){
lc++;
}
} else{
cstate = WORD;
wc++;
}
break;
case DELIM:
if (ch == '\n'){
lc++;
} else if (!isspace(ch)){
cstate = WORD;
wc++;
}
break;
case WORD:
if (isspace(ch)){
cstate = DELIM;
if (ch == '\n'){
lc++;
}
}
break;
}
}
fprintf(dest, "%d\t%d\t%d\t%s\n", wc, lc, cc, argv[1]);
}
我有一种感觉,我遇到这个问题的原因与我的 wcount 函数中的 argv[] 有关。
很抱歉这篇文章中的文字墙,我是这个网站的新手,不完全知道应该如何发布问题。谢谢
编辑:该文件是在我编译并运行程序后指定的。
所以我说
./tstats test.txt
它显示
0 0 0 test.txt
最佳答案
在
void wcount(FILE *src, FILE *dest, const char *argv[])
你得到参数argv
只是为了在
fprintf(dest, "%d\t%d\t%d\t%s\n", wc, lc, cc, argv[1]);
但是您在使用它时没有检查它是否确实存在,这是您在 input_from_args
函数中所做所做的事情。
因此,您也可以将 argc
作为 wcount
的参数传递,然后执行以下操作:
if (argc == 1) {
fprintf(dest, "%d\t%d\t%d\tstdin\n", wc, lc, cc); // no argv[1]
else {
fprintf(dest, "%d\t%d\t%d\t%s\n", wc, lc, cc, argv[1]);
}
或者您传递一个 char* filename
参数而不是 argv
,您可以在 wcount
调用之外检查该参数,然后继续执行
fprintf(dest, "%d\t%d\t%d\t%s\n", wc, lc, cc, filename);
打电话。
关于无法弄清楚为什么我的字符、单词和行计数适用于文件输入,但不适用于标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28271606/