小甲鱼C++快速入门homework

文章介绍了如何在C和C++中编写程序,从用户输入的一行整数和空格中提取整数并求和。C语言版本使用scanf_s和getchar处理空格,当遇到回车时结束输入。C++版本则利用cin和peek()、get()函数过滤空格并结束于回车。
摘要由CSDN通过智能技术生成

要求:编写一个程序,要求用户输入一串整数和任意数目的空格,

        这些整数必须位于同一行中。

        但允许出现在该行中的任何位置。

        当用户按下键盘上的"Enter"键时,数据输入结束。

        程序自动对所有的整数进行求和并打印出结果。

 C语言版本

分析:我们要从输入流中提取出整数(int)和空格(char),对整数求和。

fishc参考答案:

#include<stdio.h>
#include<stdlib.h>

int main()
{
	int n;
	int sum=0;
	char ch;
	
	while(scanf_s("%d",&n))//从输入流里提取int类数据
	{
		sum +=n;
		while((ch=getchar())== ' ')
			;//当输入为空格时不执行任何动作,以此屏蔽掉空格

		if(ch =='\n') break;//当检测到enter键,结束while循环,输出结果
		
		ungetc(ch,stdin);//退回一个ch到stdin输入流
	}
	printf("%d",sum);
	return 0;
}

 在C语言中,"stdin"代表标准输入流(Standard Input),是一个预定义的文件指针。它用于从键盘或其他输入设备读取数据。例如,使用scanf函数从键盘读取用户输入时,可以将stdin作为scanf函数的第一个参数传递,以表示从标准输入流读取数据。

类似地,stdout代表标准输出流(Standard Output),stderr代表标准错误流(Standard Error)。这些都是程序运行时默认打开的文件指针,可以用于输入和输出操作。

Q.这里为什么要退回一个字符到stdin呢???

A。举个栗子,stdin是”33 44“

程序读取33后进入循环:

先读取一个空格,无任何动作;

下一个读取到4,不是空格,退出循环,读取下一个int,但此时读取到的是4,而不是44。

my答案

#include <stdio.h>

int main() {
	int sum = 0, num;
	char c;
	
	printf("请输入一串整数和任意数目的空格(按Enter键结束):\n");
	
	while (scanf("%d", &num) == 1) { // 只要成功读入一个整数就执行循环体
		sum += num; // 将读入的整数加到总和中

// 读入一个字符,如果读入的字符是回车,则输入结束
		scanf("%c", &c); 
		if (c == '\n') { 
			break;
		}
	}
	
	printf("这些整数的和是:%d\n", sum);
	
	return 0;
}

这里优化了读取char的部分,因为只是为了屏蔽空格,不需要用while把空格读个遍。

但是我也发现了问题:这里输入的一行最后一个必须是整数才行。。。所以这是个不完善的代码。

C++版本

参考答案

#include<iostream>
using namespace std;

int main()
{
	int n,sum=0;
	
	while(cin >> n)//如果是整数,赋值给n
	{
		sum += n;//求和
		
		while(cin.peek()==' ')//如果下一个字符是空格
		{
			cin.get();//调用不带参数的 cin.get() 函数,则会从输入流中读取并返回下一个字符。即删除掉空格
		}
		if(cin.peek()=='\n') break;//如果下一个字符是回车符,则结束整个循环
	}
	cout<<sum<<endl;
	return 0;
}

cin.peek()是一个用于流输入的函数。它的作用是查看下一个字符而不读取它。

具体来说,cin.peek()会返回输入流中下一个字符,但并不将其从输入流中删除。这意味着,如果你调用了cin.peek()方法后,可以通过其他方式决定是否读取该字符,而不影响后续的输入操作。

cin.get()是C++中用于流输入的函数,它可以从输入流中读取一个字符或一行字符。具体来说,cin.get() 的功能如下:

  1. 如果调用不带参数的 cin.get() 函数,则会从输入流中读取并返回下一个字符。

  2. 如果给 cin.get() 函数传递一个字符变量作为参数,则会将下一个字符读入该变量,并返回 cin 流对象本身,以便进行链式输入操作。

  3. 如果给 cin.get() 函数传递两个参数,则会读取指定数目的字符,并将其存储在指定的字符数组中,直到达到指定数目、读取了换行符,或者遇到了文件结束标志。此时,函数将返回 cin 流对象本身,以便进行链式输入操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值