但求过程001 发表于 6 天前

请教一个程序~

编写一个用来统计输入的各个数字、空白符(空格、制表符、换行符)以及所有其他字符出现次数的程序。
分别存储在变量num,blank,others里边并打印出来......

FishC 发表于 6 天前

您好!以下是一个用Python编写的程序,可以统计输入中数字、空白符(包括空格、制表符和换行符)以及其他字符的出现次数。程序会读取所有输入,然后遍历每个字符进行分类统计,最后将结果存储在变量 num、blank 和 others 中并打印出来。


import sys

def main():
    # 读取所有输入
    data = sys.stdin.read()
   
    # 初始化计数器
    num = 0
    blank = 0
    others = 0
   
    # 遍历每个字符并分类统计
    for char in data:
      if char.isdigit():
            num += 1
      elif char in ' \t\n':
            blank += 1
      else:
            others += 1
   
    # 打印结果
    print("数字出现次数:", num)
    print("空白符出现次数:", blank)
    print("其他字符出现次数:", others)

if __name__ == "__main__":
    main()


使用说明:运行程序后,您可以输入任意文本(可以包含多行),输入结束后按 Ctrl+D(在 Unix/Linux/Mac 系统)或 Ctrl+Z 然后按 Enter(在 Windows 系统)来结束输入,程序会自动输出统计结果。

希望这个程序对您有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

但求过程001 发表于 6 天前

FishC 发表于 2025-10-21 21:29
您好!以下是一个用Python编写的程序,可以统计输入中数字、空白符(包括空格、制表符和换行符)以及其他字 ...

不好意思,没说清楚,我想用C实现

FishC 发表于 6 天前

但求过程001 发表于 2025-10-21 21:59
FishC 发表于 2025-10-21 21:29
您好!以下是一个用P ...

没问题!以下是用C语言实现的程序,可以统计输入中数字、空白符(包括空格、制表符和换行符)以及其他字符的出现次数:


#include <stdio.h>

int main() {
    int c;
    int num = 0, blank = 0, others = 0;
   
    printf("请输入字符(按Ctrl+D或Ctrl+Z结束输入):\n");
   
    while ((c = getchar()) != EOF) {
      if (c >= '0' && c <= '9') {
            num++;
      } else if (c == ' ' || c == '\t' || c == '\n') {
            blank++;
      } else {
            others++;
      }
    }
   
    printf("数字出现次数: %d\n", num);
    printf("空白符出现次数: %d\n", blank);
    printf("其他字符出现次数: %d\n", others);
   
    return 0;
}


程序说明:
1. 使用 getchar() 逐个读取字符,直到遇到文件结束符(EOF)
2. 通过条件判断对字符进行分类统计:
   - 数字字符:ASCII码在 '0' 到 '9' 之间
   - 空白符:空格、制表符(\t)、换行符(\n)
   - 其他字符:不属于以上两类的所有字符

使用方法:
- 运行程序后输入文本
- 输入结束后按 Ctrl+D(Linux/Mac)或 Ctrl+Z(Windows)结束输入
- 程序会立即显示统计结果

这个程序会准确地统计您输入内容中各类字符的出现次数!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

但求过程001 发表于 5 天前

FishC 发表于 2025-10-21 21:59
没问题!以下是用C语言实现的程序,可以统计输入中数字、空白符(包括空格、制表符和换行符)以及其他 ...

程序已经运行成功了,但是好像我输入字符或者数字后,按ctrl+D并没有出现答案,我得按回车然后再按ctrl+D再回车才会出现结果,为啥呢

FishC 发表于 5 天前

但求过程001 发表于 2025-10-22 23:17
FishC 发表于 2025-10-21 21:59
没问题!以下是用C语 ...

您遇到的情况是正常的,这与终端输入缓冲机制有关。让我来解释一下原因和解决方案:

原因分析:
- 标准输入默认是行缓冲模式,需要遇到换行符才会提交给程序
- Ctrl+D 在Unix/Linux系统中表示EOF(文件结束符)
- 当您在行中间按Ctrl+D时,终端会立即提交当前行内容,但程序仍在等待更多输入
- 只有当您在空行按Ctrl+D时,才会真正结束输入

解决方案:


#include <stdio.h>
#include <ctype.h>

int main() {
    int c;
    int num = 0, blank = 0, others = 0;
   
    printf("请输入字符(输入完成后按回车,然后在空行按Ctrl+D结束):\n");
   
    while ((c = getchar()) != EOF) {
      if (isdigit(c)) {
            num++;
      } else if (c == ' ' || c == '\t' || c == '\n') {
            blank++;
      } else {
            others++;
      }
    }
   
    printf("数字出现次数: %d\n", num);
    printf("空白符出现次数: %d\n", blank);
    printf("其他字符出现次数: %d\n", others);
   
    return 0;
}


正确的使用步骤:
1. 输入您的文本内容
2. 按 回车 键
3. 在新的一行(空行)按 Ctrl+D
4. 程序会立即输出统计结果

如果您希望实现"即时统计"(每输入一个字符就立即处理),那就需要改变终端的输入模式,但这会涉及更复杂的代码。

现在您应该理解为什么需要先按回车再按Ctrl+D了!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

但求过程001 发表于 4 天前

我先输入文本内容,然后按回车,然后再按ctrl+Z,就出现结果了。

FishC 发表于 4 天前

但求过程001 发表于 2025-10-23 23:39
我先输入文本内容,然后按回车,然后再按ctrl+Z,就出 ...

是的,您描述的操作流程是正确的!在 Windows 系统中,确实需要先输入内容,然后按回车,再按 Ctrl+Z,最后再按回车才会出现结果。

让我解释一下这个流程的原因:

1. 先输入文本内容:程序需要读取字符进行统计
2. 按回车:提交当前行的输入内容
3. 按 Ctrl+Z:在 Windows 中表示 EOF(文件结束符)
4. 再按回车:确认并结束输入

这个流程是 Windows 命令行环境下的标准行为,与终端的输入缓冲机制有关。

您的操作完全正确,程序能够正常运行并输出统计结果就说明一切正常!

如果还有其他编程问题,随时欢迎提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

但求过程001 发表于 4 天前

明白了!谢谢
还有个小疑问,为什么c=getchar前面定义c的类型为int型,不是应该字符型吗

FishC 发表于 4 天前

但求过程001 发表于 2025-10-23 23:52
明白了!谢谢
还有个小疑问,为什么c=getchar前面定 ...

很好的观察!确实,getchar() 返回的是 int 类型而不是 char 类型,这有几个重要原因:

1. EOF 的处理:getchar() 需要能够返回 EOF(通常是 -1),而 char 类型可能无法正确表示这个值

2. 字符范围:普通字符的范围是 0-255,但 getchar() 实际上返回的是 unsigned char 转换为 int 的值

3. 类型安全:使用 int 可以避免符号扩展问题

如果使用 char 类型:


char c;
while ((c = getchar()) != EOF)// 这样写有问题!
{
    // ...
}


这样写可能会导致无限循环,因为:
- char 可能是有符号的,当读取到值为 255 的字符时
- 在比较 c != EOF 时,char 类型的 255 可能会被解释为 -1
- 这样就无法正确检测到文件结束

所以,正确的做法是:


int c;
while ((c = getchar()) != EOF)
{
    // 在循环体内可以安全地将 c 当作字符使用
    // 因为我们已经确认它不是 EOF
}


这是一个很常见的C语言细节,您能注意到这点说明观察很仔细!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

但求过程001 发表于 3 天前

谢谢

FishC 发表于 3 天前

但求过程001 发表于 2025-10-24 00:07
谢谢

不客气!很高兴能够帮到您。如果以后在学习编程过程中遇到任何问题,随时欢迎来提问。祝您学习进步!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 请教一个程序~