C、C++如何判断输入结束?

在初学者使用C语言或者C++编写程序的时候经常会遇到这样的一个问题:要求输入一系列数据或者一个字符串然后需要读取保存这些数据。若是用数组区保存是不能实现的(因为数组不可以用变量定义)这时候就需要用到动态数组vector,但是用vector后又会发现不知道怎么去判断输入结束(在题目没有表示输入结束的标识情况下)这该如何去解决呢?
这也是我在刷PAT 的时候曾经遇到的问题,题目是这样的:
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10
​100
​​ 。

输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:
1234567890987654321123456789
输出样例:
yi san wu

一开始用int去保存输入发现输入样例已经超过了int所能表示的最大数,这时候想着用Java的BigInteger应该可以解决的,但我还是尝试用C++写一下,先定义一个vector把数字的每一位存进去这时候就遇到了如何判断读取到数据末尾的问题,网上一些人提供的解决办法有:1、C语言的输入函数,有些自带了结束标志,就不需要再进行人为判断了(本题不适用)
2、定义’\0’等字符作为结束字符,当输入为’\0’时就判断为输入结束(不适用)
3、输入函数scanf() gets()都有返回值,当输入到文件尾(此处“文件”可以理解为输入流)或输入错误时返回EOF,则可以在需要结束输入的时候手动键入EOF,则输入函数读取到该字符时返回EOF,就能知道输入结束了。(我尝试用scanf("%c",&n)!=EOF 和scanf("%c",&n)!=0 去判断都不可行,或许是我代码的其他问题,大家可以自己尝试一下)

然后我就想到了用getchar()这种提取输入得方式,因为输入的数字与字符在ASCII码上相差48,可以用类似于1=‘1’-48这种形式来转换,在输入结束时可以用getchar()来提取换行符,换行符的ASCII是10,这时就可以用getchar()==10来判断已经读取输入到末尾了。当然这种判断不能用在有多行输入的情形。
附上上面提到的PAT题目编写的代码:

`#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
void write(vector<int> v){
    
    
	int n = v.size();
	for (int i= n-1; i>=0; i--)
	{
    
    
		switch (v[i])
		{
    
    
		case 1:printf("%s", "yi");
			break;
		case 2:printf("%s", "er");
			break;
		case 3:printf("%s", "san");
			break;
		case 4:printf("%s", "si");
			break;
		case 5:printf("%s", "wu");
			break;
		case 6:printf("%s", "liu");
			break;
		case 7:printf("%s", "qi");
			break;
		case 8:printf("%s", "ba");
			break;
		case 9:printf("%s", "jiu");
			break;
		case 0:printf("%s", "ling");
			break;
		default:
			break;
		}
		if(i!=0)
		printf("%c", ' ');
	}
}
int main(){
    
    
     int sum=0,temp;
	vector<int> n;
	vector<int> vec;
	int tem=getchar();
	while (tem!=10) 
    {
    
    
		temp = tem - 48;
		n.push_back(temp);
		tem = getchar();
	}
	for (int i = 0; i < n.size(); i++)
    {
    
    
		sum += n[i];
	}
	while (sum != 0) 
    {
    
    
		temp = sum % 10;
		vec.push_back(temp);
		sum = sum / 10;
	}
	write(vec);
    return 0;
}`

猜你喜欢

转载自blog.csdn.net/weixin_46088099/article/details/112467908