C语言笔记-getchar等蛋疼设定 [可能已解决]

疑问先, getchar()只能接受一个字符, putchar()只能输出一个字符, 为啥下面这个例子可以输出好多个字符呢...

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int ch;
 5     while((ch=getchar())!=EOF)
 6     {
 7         putchar(ch);
 8     }
 9     return 0;
10 }

结果:

this is a long long sentence.... //这句是我输入的
this is a long long sentence.... //这句就是输出的

后来读了其他解释的文章, 我特么好像明白了!

没准是我输入的整段句子都进了缓冲区, getchar()一次一个字符的存,putchar()一次一个字符的输出, 然后只要读取的不是EOF, 就一直输出, 那是不是我写一篇文章都能给我输出来!?

结果:

1 你看我在写一篇文章哦!看看它是不是都能给我输出出来!!!//这句是我输入的
2 你看我在写一篇文章哦!看看它是不是都能给我输出出来!!!//这句是它输出的

后来例子作者给出了等效的代码:

1 上述代码等同于:
2 while(1) //无限循环下去,只要不是EOF
3 {
4     ch=getchar();
5     if(ch==EOF)
6     {
7         break;
8     }
9     putchar();

看来应该是这样了吧...

于是可以拿来进行这个例子(计算输入流中出现的数字字符数.)

 1 //计算输入流中出现的各数字字符数
 2 #include <stdio.h>
 3 int main()
 4 {
 5     int n,number;
 6     int a[10]={0};//设立一个数组,代表0~9这10个不同的数字,赋值0.
 7     while((number=getchar())!=EOF)
 8     {
 9         switch(number)
10         {
11             case‘0‘://注意是case ‘0‘,不是case(0)
12                 a[0]++;
13                 break;
14             case‘1‘:
15                 a[1]++;
16                 break;
17             case‘2‘:
18                 a[2]++;
19                 break;
20             case‘3‘:
21                 a[3]++;
22                 break;
23             case‘4‘:
24                 a[4]++;
25                 break;
26             case‘5‘:
27                 a[5]++;
28                 break;
29             case‘6‘:
30                 a[6]++;
31                 break;
32             case‘7‘:
33                 a[7]++;
34                 break;
35             case‘8‘:
36                 a[8]++;
37                 break;
38             case‘9‘:
39                 a[9]++;
40                 break;
41         }
42     }
43     printf("\n各数字出现次数:");
44     for(n=0;n<10;n++)
45     {
46         printf("\n%d:%d次",n,a[n]);
47     }
48     return 0;
49 }

结果:

5.3495346956991216495502//这个是我输入的,回车
^Z//按ctrl+z.回车

各数字出现次数:
0:1次
1:2次
2:2次
3:2次
4:3次
5:5次
6:3次
7:0次
8:0次
9:5次
时间: 2024-11-02 14:18:03

C语言笔记-getchar等蛋疼设定 [可能已解决]的相关文章

C语言笔记1--类型、运算符与表达式

 C语言笔记1--类型.运算符与表达式 总论: 变量和常量是程序处理的两种基本的数据对象.声明语句说明变量的名字和类型,也可以指定变量的初值.运算符指定将要进行的操作.表达式则把变量与常量组合起来生成新的值.对象的类型决定该对象可取值的集合以及可以对该对象执行的操作. 一.变量与常量的名字 1.名字是由字母.下划线和数字组成的序列,其第一个字符必须为字母:下划线"_"被看做是字母,但一般不要以下划线"_"开头. 2.名字区分字母大小写,变量名使用小写字母.符号常量

C语言笔记

C语言笔记 基础知识 数据类型 序号 类型与描述 1 基本类型: 它们是算术类型,包括:整数类型.浮点类型 2 枚举类型: 也是算术类型,被用来定义只能使用某些整型值的变量,使用时需要程序员先使用eumn关键字来声明定义 3 Void类型: 用于函数,指明函数的返回值或参数.作用于变量会发生编译错误 4 派生类型: 包括:指针类型.数组类型.结构类型.联合体类型.函数类型 补充:1.函数类型是指函数返回值的类型,数组类型与结构类型统称为聚会类型. 2.除了基本类型,其他的类型都是程序员使用相关关

C++语言笔记系列之十二——C++的继承

C++的继承 1.继承方式 public(公有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象只能访问基类的public成员. protected(保护继承),private(私有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象不能访问基类的任何成员. 2.例子 example 1: #include <iostream.h> clas

C++语言笔记系列之十六——赋值兼容规则&amp;多继承的二义性

1.赋值兼容规则 (1)派生类对象可以给基类对象赋值,这种情况下派生类对象将从基类继承的成员的值赋值给一个基类对象:但是不允许将一个基类的对象赋值给一个派生类. (2)可以将派生类对象的地址赋给基类指针,使基类指针指向派生类对象,通过基类指针引用成员时只可以引用派生类从基类继承而来的成员,而不允许引用派生类的新成员. (3)引用与指针相同. 2.多继承 (1)一个派生类从两个以上的基类中去继承. (2)说明: class 派生类名:继承方式 基类1, 继承方式 基类2,...... {派生类成员

C++语言笔记系列之十七——虚基类

1.虚基类 考虑这样一种情况:当某个类的部分或者全部直接基类是另一个共同基类派生而来,这些直接基类从上一级基类继承而来的成员就一定拥有相同的名称,这样就会产生二义性问题. 解决办法:当派生类和直接基类产生了二义性问题-->加类的作用域. 当派生类和间接基类产生了二义性问题-->虚基类. 2.虚基类的说明: class 派生类名:virtual 访问权限 基类名 {派生类定义}; 注意:在定义派生类时将需要继承的基类进行虚化声明,虚基类的说明在派生类的定义中完成. 作用:将基类说明为虚基类之后,

C++语言笔记系列之十三——派生类构造函数的调用

1.派生类构造函数的调用 (1)一个基类的所有数据成员均被派生类继承.创建一个派生类对象时,系统在为派生类对象分配单元时一定要为其基类数据成员分配子空间. (2)一个派生类对象在创建时不仅要调用派生类构造函数,而且要调用基类构造函数. 派生类中的数据成员在派生类中构造. 基类中的数据成员在基类中构造. 原因: A.构造函数不继承. B.派生类的构造函数必须通过调用基类的构造函数完成基类数据成员的初始化. C.若派生类中含有子对象,必须调用子对象的构造函数. 2.派生类的构造函数 派生类名(总参数

C++语言笔记系列之十八——虚函数(1)

1.C++中的多态 (1)多态性:同一个函数的调用可以进行不同的操作,函数重载是实现多态的一种手段. (2)联编:在编译阶段进行联接,即是在编译阶段将一个函数的调用点和函数的定义点联接起来. A.静态联编:在编译阶段就完成的函数联编--函数重载. B.动态联编:在程序的运行阶段由系统自动选择具体的函数--虚函数. 注:C++的多态主要指的就是动态联编. 2.虚函数 (1)虚函数是在函数的定义时将其声明为虚函数即可. (2)说明:virtual 数据类型 函数名(参数表) {函数体} A.目的:当

C++语言笔记系列之十四——继承后的访问权限

1.析构函数不继承:派生类对象在析构时,基类析构函数的调用顺序与构造函数相反. 注:派生类对象建立时要调用基类构造函数,派生类对象删除时要调用基类析构,顺序与构造函数严格相反. 2.例子 example 1 #include <iostream.h> #include <math.h> class Point { public: Point(double a, double b, doule c) { x = a; y = b; z = c; } double Getx() {re

C++语言笔记系列之十五——派生类、基类、子对象的构造和析构函数调用关系

例子 example 1 注:若一个基类同时派生出两个派生类,即两个派生类从同一个基类继承,那么系统将为每一个简历副本,每个派生类独立地使用自己的基类副本(比如基类中有属于自己类的静态变量等). #include <iostream.h> class Person { public: person() {cout<<"Construction of person."<<endl;} ~person() {cout<<"Destr