【小甲鱼C++快速入门】P2 从一个小程序讲起2

本文介绍了C++快速入门的第二部分,从一个计算输入数字和的小程序出发,讲解了C语言中scanf的使用,包括其如何处理空格和缓冲区的管理。接着讨论了C++中变量的定义灵活性,并列举了cin和cout类的几个常用方法,如ignore、getline、peek、get和read等,帮助理解C++的输入输出操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从一个小程序讲起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的用法:

  1. 一定要注意scanf这个函数的本质是:用格式化的方法从缓冲区中读取内容,并且会忽略空格和回车。也就是说如果我写了一个scanf("%d",&a);,然后在屏幕上输入48 98 25,这时候scanf只会读取48并赋值给a。但是当我再次调用scanf("%d",&a);的时候,因为这个时候缓冲区已经不是空的了,所以程序不会再要求我输入数据,而是会直接忽略48和98之间的空格,并读取到98赋值给a。
  2. scanf函数的返回值:如果函数调用成功,返回值是成功获取并填充到附加参数中的个数。如果函数调用失败,返回值小于附加参数的个数(甚至是 0)。如果读取到标准输入流的结尾处,则返回 EOF。
  3. 每次输入会以一个换行符作为结束标志,但是,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类的一些方法(举例说明):

  1. cin.ignore(7);:忽略输入流中前七个元素。
  2. cin.getline(buf,10); 读取输入流中的10个元素到数组buf中。
  3. cin.peek(); 读取输入流中的第一个元素并返回它的值,但不把这个元素从输入流中删除。
  4. cin.get(); 读取输入流中的第一个元素并返回它的值,并且把这个元素从输入流中删除。
  5. cin.read(buf,20); 读取20个元素到buf数组中。注意cin.read和cin.getline的区别在于getline只能读一行的内容,而read则没有这个限制。
  6. cin.gcount(); 计算cin读入了多少个元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值