从一个小程序讲起2
1.这个小程序的C语言实现
虽然已经开始学C++,但是这里这个C语言的程序还是有很多地方需要注意。这个程序要实现的功能是,用户输入一些数字,这些数字中间可以有任意的空格,但是这些数字都位于同一行,用户输入结束后,程序计算出这些数字的和并输出。
#include <stdio.h>
#include <stdlib.h>
void main()
{
int i;
int sum = 0;
char ch;
printf("please type in the numbers: ");
while( scanf("%d", &i) == 1 )
{
sum += i;
while( (ch=getchar()) == ' ' )
;
if( ch == '\n' )
{
break;
}
ungetc( ch, stdin );
}
printf("the result is: %d", sum);
printf("\n");
system("pause");
}
这里值得注意的是scanf的用法:
- 一定要注意scanf这个函数的本质是:用格式化的方法从缓冲区中读取内容,并且会忽略空格和回车。也就是说如果我写了一个
scanf("%d",&a);
,然后在屏幕上输入48 98 25
,这时候scanf只会读取48并赋值给a。但是当我再次调用scanf("%d",&a);
的时候,因为这个时候缓冲区已经不是空的了,所以程序不会再要求我输入数据,而是会直接忽略48和98之间的空格,并读取到98赋值给a。 - scanf函数的返回值:如果函数调用成功,返回值是成功获取并填充到附加参数中的个数。如果函数调用失败,返回值小于附加参数的个数(甚至是 0)。如果读取到标准输入流的结尾处,则返回 EOF。
- 每次输入会以一个换行符作为结束标志,但是,scanf函数并不会读取这个换行符,也就是说每次调用完scanf,缓冲区中都会留下一个换行符。良好的编程习惯是,要么每次调用完scanf都使用getchar读取掉这个换行符,或者使用fflush函数刷新缓存区。
另外关于ungetc( ch, stdin );
,这句的意思是把ch中的内容退还到缓冲区中。因为当getchar读到不是空格的内容才会退出while循环,可是这时已经有数字的内容从缓冲区中被读取了,之后scanf就读不到这部分内容了,所以要退还这个内容。
有了上面几点理解,我发现小甲鱼的程序写复杂了,scanf函数会自动忽略空格,所以不需要用getchar来屏蔽空格了,又因为每个数字之间都至少有一个空格,所以可以这样写:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int i;
int sum = 0;
char ch;
printf("please type in the numbers: ");
while( scanf("%d", &i) == 1 )
{
sum += i;
if ((ch = getchar()) == '\n')
{
break;
}
}
printf("the result is: %d", sum);
printf("\n");
system("pause");
}
2.C++的一些知识点
与C语言不同,C++允许在任意位置定义变量。
cin和cout类的一些方法(举例说明):
- cin.ignore(7);:忽略输入流中前七个元素。
- cin.getline(buf,10); 读取输入流中的10个元素到数组buf中。
- cin.peek(); 读取输入流中的第一个元素并返回它的值,但不把这个元素从输入流中删除。
- cin.get(); 读取输入流中的第一个元素并返回它的值,并且把这个元素从输入流中删除。
- cin.read(buf,20); 读取20个元素到buf数组中。注意cin.read和cin.getline的区别在于getline只能读一行的内容,而read则没有这个限制。
- cin.gcount(); 计算cin读入了多少个元素。