【问题标题】:how to use eof for count letters of a string (ansi c)如何使用 eof 计算字符串的字母(ansi c)
【发布时间】:2014-10-22 20:07:28
【问题描述】:

我是编程新手,现在我正在尝试学习如何使用 EOF。

我想从键盘插入一个字符串并计算字母。 例如

给字符串:abcd
我有 1a , 1b , 1c ,1d。

到目前为止我的代码是

while(scanf("%s",s)!=EOF){

    if(s[i]=='a')
        counta++;
    if(s[i]=='b')
        countb++;

    //and so on

    i++;
}

【问题讨论】:

  • 请注意,使用counta 等是一个轻微(但非常冗长)的灾难。您应该使用一个整数数组,由s[i](unsigned char) 值索引(当您有第二个循环时,如Woodrow BarlowanswerDanke Xieanswer 所示)。

标签: c count eof letters


【解决方案1】:

您的终端以一种称为“规范模式”(也称为“行缓冲模式”)的方式运行。这意味着标准输入实际上是缓冲的——在用户按下回车之前,您的程序不知道标准输入上有任何内容(这是规范终端的触发器)。这是一种比非缓冲输入更有效的输入处理方式。 正因为如此,当使用像scanf这样的函数时,在你按下回车之前你不会从stdin获取任何数据,此时你会得到整个字符串。

while(scanf("%s",s) != EOF) // get a line of input from stdin until input is finished
{
  int i;
  for(i = 0; s[i] != '\0'; i++) // scan each character of that line
  {
    // check the value of s[i] and do some action
  }
}

请注意,这将一直持续到发送 EOF 字符而不是一行文本。这可能在两种情况下发生:如果输入是从文件通过管道传输的,则发生在文件末尾;如果输入来自终端的键盘,则在您发送中断 (ctrl+C) 时发生。

【讨论】:

  • 使用for 循环可能会做得更好,尤其是当您真的不想增加i 直到循环结束时。替代方案是while ((c = s[i++]) != '\0'),并在循环体中使用c 而不是s[i]c 的类型可能应该是 unsigned char(以防普通 char 是有符号数量)。
  • i++ 在每次循环迭代结束之前不会发生(C 副作用),这不是真的吗?
  • 副作用在语句结束时完成,在这种情况下是while循环的条件部分。
【解决方案2】:

scanf("%s", s) 在到达标准输入 (stdin) 的末尾时返回 EOF。您需要另一个循环来遍历每个字符串中的字符:

while(scanf("%s",s)!=EOF) {
   for (int i = 0; s[i]; i++) {
       if(s[i]=='a')
           counta++;
       else if(s[i]=='b')
           countb++;
       //and so on
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多