无法弄清楚为什么我的字符、单词和行计数适用于文件输入,但不适用于标准输入

标签 c unix

我对 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/

相关文章:

c - 如果用户输入某些内容,则在语句之间切换 : infinitely and with a timeout

c++ - 如何将管道作为文件传递给 C 应用程序?

c - C中的宽度格式化程序

unix - 如何在 Unix 中删除文件中的重复行而不对其进行排序

linux - 将分隔字段移动到具有不同分隔符的新行中[再次更新]

c - 将窗口大小调整为 X 个字符(不是像素)

c++ - 计时器精度 : c clock( ) vs. WinAPI 的 QPC 或 timeGetTime( )

用C语言创建一个随机字符

c - 一分钟 while 循环

bash - Grep 跨 Hadoop 文件系统中的多个文件