1、输入数字
- 输入的测试样例有多组,每组需要相同的处理逻辑
方案:
c语言中:scanf("%d",&n)!=EOF
c++中:while(cin>>n)
例如:计算两数之和,输入可能有多组样例。
#include <iostream>
using namespace std;
int main(){
int a,b;
while(scanf("%d %d",&a,&b)!=EOF){
cout<<a+b<<endl;
}
return 0;
}
c++写法:
#include <iostream>
using namespace std;
int main(){
int a,b;
while(cin>>a>>b){
cout<<a+b<<endl;
}
return 0;
}
(什么时候结束不明确,判题系统来判断,不需要人为)上面的情况,需要手动ctrl+z结束输入。
(什么时候结束明确,需要写代码的人来判断)上面的程序根据N自动结束。
(什么时候结束明确,需要写代码的人来判断)最后0 0结束。
(什么时候结束明确,需要写代码的人来判断)N=0退出。
(什么时候结束不明确,判题系统会给自动退出)
解释一下C语言中的scanf()函数,它的返回值可以分为以下几种情况:一般是返回按照指定格式输入变量的个数,但若遇到错误或者遇到end of file,则返回-1。EOF是一个系统预定义的一个常量,它的值是-1。验证:
#include <iostream>
using namespace std;
int main(){
int a,b;
cout<<"EOF的值为:"<<EOF<<endl;
int temp1 = scanf("%d",&a);
cout<<"此时scanf()函数的返回值:"<<temp1<<endl;
int temp2 = scanf("%d %d",&a,&b);
cout<<"此时scanf()函数的返回值:"<<temp2<<endl;
int temp3 = scanf("%d %d",&a,&b);
cout<<"此时scanf()函数的返回值:"<<temp3<<endl;
return 0;
}
2、输入字符
- 不明确有几组测试样例,判题系统会自己判断
方案:
c语言中:scanf("%c",&ch)!=EOF
c++中:while(cin.get(ch))
下面这道题卡了好长时间......
- 明确有几组测试用例
正常来做就可。
3、输入一个数组
- 长度确定
正常来做即可(for,while等)
2. 长度不确定
当输入一个数组时,无法确定其长度时,通过输入换行还结束输入。
方案:
c语言中:getchar()
c++:cin.get()
2.1 给出数组上界,并且上界可以接受:
c语言:
#include <iostream>
using namespace std;
int main(){
int A[100];
int i = 0;
for(i=0;;i++){
cin>>A[i];
if(getchar()=='\n')
break;
}
for(int j=0;j<i+1;j++)
cout<<A[j]<<endl;
return 0;
}
或者写成以下形式:
#include <iostream>
using namespace std;
int main(){
int A[100];
int i = 0;
while(cin>>A[i] && getchar()!='\n'){
i += 1;
}
for(int j=0;j<i+1;j++)
cout<<A[j]<<endl;
return 0;
}
c++写法:
#include <iostream>
using namespace std;
int main(){
int A[100];
int i = 0;
while(cin>>A[i] && cin.get()!='\n'){
i += 1;
}
for(int j=0;j<i+1;j++)
cout<<A[j]<<endl;
return 0;
}
2.2 数组上界不确定
因为可能有100个数,1000个数,10000个数的输入。可以利用vector动态数组来实现:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vec;
int i = 0;
int x;
for(i=0;;i++){
cin>>x;
vec.push_back(x);
if(cin.get()=='\n')
break;
}
for(int j=0;j<i+1;j++)
cout<<vec[j]<<endl;
return 0;
}
3、字符串
C++中因为支持了string类型,所以大大简化了关于字符串的一系列操作。
方案:
处理连续非空的字符串,只要输入即可cin>>str;
对于字符串中含有空格的情况,使用getline函数实现
#include <iostream>
using namespace std;
int main(){
string str;
cin>>str;
cout<<str<<endl;
return 0;
}
#include <iostream>
using namespace std;
int main(){
string str;
getline(cin,str);
cout<<str<<endl;
return 0;
}
ps:如果在一个程序中先使用cin>>str输入,然后再使用getline函数的话,需要再cin>>str之后使用cin.get()处理回车才行,也就是把回车当做cin.get()的输入,毕竟用户确实输入了一个回车
#include <iostream> using namespace std; int main(){ string str; cin>>str; cout<<str<<endl; cin.get(); getline(cin,str); cout<<str<<endl; return 0; }
4.1 for循环
int value=0, sum=0;
for (; cin >> value;)
sum += value;
4.2 while循环
int a[10], i(0);
while (cin>>(a[i])) {
cout << "i的值为" << i << endl;
i++;
}
while和for都可以通过ctrl+z结束循环。
4.3 do...while循环
int a[10], i(0);
cin >> (a[i]);
do{
cin >> (a[i]);
} while (true);
ctrl+z退出不了
输入后再判断(可能)
改写:
int a[10], i(0);
cin >> (a[i]);
do{
cout << "i的值" << i << endl;
i++;
} while (cin >> (a[i]));
回过头来看,cin>>a[i] 都在for循环或者while循环中 判断循环结束的位置
ctrl+z并不会cin到变量
4.4 查看ctrl+z在变量内存中究竟是什么?
4.4.1 cin>>intXf方式
int value;
cin >> value;
cout << value << endl;
结果为随机数,证明没有真正输入到变量内存中
4.4.2 cin>>charX
char value;
cin >> value;
cout << value << endl;
输出空白,还是没有输入到变量内存中
4.4.3 intX = cin.get()方式
int value;
value=cin.get();
cout << value << endl;
char类型是什么结果?
char value;
value=cin.get();
cout << value << endl;
(借用大佬的分析)
参考来源:
C/C++中的结束输入条件判断 (scanf、EOF、getchar()、cin.get()、getline)_c++判断输入结束-CSDN博客