要求:编写一个程序,要求用户输入一串整数和任意数目的空格,
这些整数必须位于同一行中。
但允许出现在该行中的任何位置。
当用户按下键盘上的"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()
的功能如下:
-
如果调用不带参数的
cin.get()
函数,则会从输入流中读取并返回下一个字符。 -
如果给
cin.get()
函数传递一个字符变量作为参数,则会将下一个字符读入该变量,并返回cin
流对象本身,以便进行链式输入操作。 -
如果给
cin.get()
函数传递两个参数,则会读取指定数目的字符,并将其存储在指定的字符数组中,直到达到指定数目、读取了换行符,或者遇到了文件结束标志。此时,函数将返回cin
流对象本身,以便进行链式输入操作。