【问题标题】:fget(c) - scanning the next character while saving the previousfget(c) - 在保存前一个字符的同时扫描下一个字符
【发布时间】:2016-01-04 11:53:55
【问题描述】:

我正在尝试创建一个程序来读取文件并计算以 'a' 开头的单词数。

我的想法是:

  • 扫描一个字符,看看它是否是字母。

  • 如果不是那么我就知道下一个字符是一个新词

  • 扫描下一个字符以检查它是'a'还是'A'

我想知道的是,是否有一种简单的方法可以使用fgetc() 扫描下一个字符,同时还能记住前一个字符。

类似:

char letter;
int aCount = 0;

while ((letter = fgetc(testFile)) != EOF) {

    if (isalpha(letter) == false && ('nextCharacter' == 'a' || 'nextCharacter' == 'A')) {

        aCount++; 
    }
}

非常感谢。

【问题讨论】:

  • 这就是变量的作用:记住一个值。但是fgetc 返回一个int,而不是char,这是有充分理由的!请阅读函数的手册页。
  • amey,这是一个例子,其中 'nextcharacter' 将是一个包含找到的单词的下一个字符的变量
  • 代码无效,正如他所说的“类似”;
  • 用于存储为什么不使用数组并对其进行迭代。
  • 所以我需要声明一个名为“prevChar”的新变量并添加类似 if islapha(letter) == false { prevChar == letter } 的实现,然后从那里继续?

标签: c file-io fgetc


【解决方案1】:

你的代码有几个问题:

  • 从文件中读取的字节应存储到int 变量中,以容纳EOF 和所有无符号字符值。如果将其存储到 char 变量中,则无法可靠地检查 EOF
  • 您应该保存前一个字节以测试字开头,并使用letter检查当前字是否以'a''A'开头。

这是一个更正的版本:

int prev = ' '; // pretend there is a non letter before the first byte.
int c;
int aCount = 0;

while ((c = fgetc(testFile)) != EOF) {

    if (!isalpha(prev) && (c == 'a' || c == 'A')) {
        aCount++; 
    }
    prev = c;
}
printf("there are %d words starting with 'a'\n", aCount);

【讨论】:

  • 感谢您的帮助,我认为我的主要问题是我认为 fgetc() 返回的是 char 而不是 int。
  • int c; while ((c = fgetc(testFile)) != EOF) { ... } 是一种非常惯用的逐字节解析流的方式。
猜你喜欢
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2017-11-23
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多