【问题标题】:How to read character until a char character?如何读取字符直到一个字符?
【发布时间】:2020-03-19 13:05:14
【问题描述】:

我正在尝试执行一个循环,从文件中读取单个字符,直到找到'\n''*'

这是我写的循环:

i=0;
do { 
      fscanf(fin,"%c",&word[i]);
      i++;
    } while(word[i]!='*'&&word[i]!='\n');

现在我试着看看为什么它不能与调试器一起工作。当我在fscanf 之后立即打印word[i] 时,它会显示正确的字符,但是如果我在与'*''\n' 进行比较时尝试打印word[i],它会告诉我word[i]'\000' 并且循环永远不会结束。

我也试过fgetc,但我有同样的错误。

【问题讨论】:

  • 在我看来 i++ 意味着 fscanf(fin,"%c",&word[i]) 中的 iwhile(word[i]!='*'&&word[i]!='\n') 中的 i 的值不同。
  • 我没有意识到,我在循环中放了一个 if 子句,现在它可以工作了,谢谢
  • 你还应该添加一个条件来检查你没有超过单词数组的长度。
  • 也在调试器中打印i

标签: c input char infinite-loop


【解决方案1】:

另一种方式:

for(;;) {
   int c = fgetc(fin);
   if ( c == EOF ) {
      break;
   word[i] = c;
   if( c == '*' || c == '\n' ) {
      break;
   }
}

【讨论】:

  • +1 表示不涉及任何虚假分配的方式;可能需要i 来做更多的事情,(比如终止字符串。)
  • 我的例子只是需要的一部分。它还需要确保 word[] 没有被过度索引。只有当它真的应该是一个字符串,而不仅仅是一个字符数组时,它才应该添加终止 NUL。
【解决方案2】:

您必须确保您正在处理的字符与您刚刚读取的字符相同。

实际上,您在测试单词 [i] 之前增加了计数器 i,这就是您的检查失败的原因。

试试吧

i=0;
do { 
      fscanf(fin,"%c",&word[i]);
    }while(word[i]!='*'&&word[i++]!='\n');

我宁愿将检查移到循环中(如果条件满足则中断)留在 while 检查单词数组长度的测试。

【讨论】:

  • 是否应该在&&word[i++]!='\n'之前有一个&& (i < word.length),如suggested by Dan? (我不知道 C 的数组长度。)
  • @Andrew Morton。我同意,我已经写了。但是我只是根据已知信息提供了代码(word.lenght 听起来像是 c++ 的特性,这是 C)
  • 显然,如果 OP 使用他们设置数组的长度,那将是最好的。 (供 OP 参考:How do I determine the size of my array in C?。)
【解决方案3】:

您的while 条件未测试您刚刚阅读的word 的相同元素,因为i++ 在测试前增加了变量。

将测试更改为使用 word[i-1] 而不是 word[i] 以对此进行调整。

顺便说一句,word[i] = fgetc(fin); 是读取一个字符的更简单方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2012-04-16
    • 2018-01-26
    • 2017-04-27
    • 1970-01-01
    相关资源
    最近更新 更多