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

Posted

技术标签:

【中文标题】无法弄清楚为啥我的字符、字数和行数适用于文件输入,但不适用于标准输入【英文标题】:Cant figure out why my character, word and line count will work with file input but not from stdin无法弄清楚为什么我的字符、字数和行数适用于文件输入,但不适用于标准输入 【发布时间】:2015-02-02 05:29:54 【问题描述】:

我对 C 编程很陌生,但我在使用标准输入时遇到了问题。我的代码应该显示输入文件或标准输入中包含的字数、行数和字符数。如果它显示文件中的数字,则文件名需要与字数、行数和字符数一起显示,如下所示:

0 0 0 测试.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[] 有关。

很抱歉这篇文章中的文字墙,我是这个网站的新手,不完全知道我应该如何发布问题。谢谢

edit:文件是我编译运行程序后指定的。

所以我说

./tstats test.txt

它会显示

0    0    0    test.txt

【问题讨论】:

我注意到的第一件事(最后一行):argv[1] 仅在您指定文件时才有效。如果没有,则 argv[1] 无效。 【参考方案1】:

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);

打电话。

【讨论】:

以上是关于无法弄清楚为啥我的字符、字数和行数适用于文件输入,但不适用于标准输入的主要内容,如果未能解决你的问题,请参考以下文章

无法弄清楚为啥我的提交按钮不会提交

无法弄清楚为啥 docker compose up 没有运行我的 React JS 应用程序

无法弄清楚如何使用适用于 Linux 和 composer 的 Windows 子系统运行 box\Spout

用c ++创建矩阵

无法弄清楚为啥我的注销按钮不起作用(php)[重复]

无法弄清楚为啥我在我的 jsonp 序列化中得到重复数据