- 发现一个C++输入字符时的问题,这里做个记录。
- 输入测试数据:
#CHENQI
+CHENHA
$
- cin 和 getchar 配合,带输入优化代码:
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
#define maxn 50001
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int x, y, s1, s2, t, i, j, s;
int cnt = 0; //總輸入序號
char ch;
string name;
while (ch = getchar(), ch != '$')
{
cin >> name;
cout << "ch = " << ch << " name=" << name << endl;
getchar();
}
return 0;
}
- 输出结果:
ch = # name=
ch = H name=
ch = N name=
ch = I name=
ch = + name=
ch = H name=
ch = N name=
ch = A name=
- 去掉输入优化代码:
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
#define maxn 50001
int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
int x, y, s1, s2, t, i, j, s;
int cnt = 0; //總輸入序號
char ch;
string name;
while (ch = getchar(), ch != '$')
{
cin >> name;
cout << "ch = " << ch << " name=" << name << endl;
getchar();
}
return 0;
}
- 输出结果:
ch = # name=CHENQI
ch = + name=CHENHA
- 以上表明,当使用cin和getchar配合时,加入输入优化,cin不能正常读入。
- 当不使用getchar,全部使用cin时,无论是否使用输入优化,结果都符合预期:
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
#define maxn 50001
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int x, y, s1, s2, t, i, j, s;
int cnt = 0; //總輸入序號
char ch;
string name;
while (cin>>ch, ch != '$')
{
cin >> name;
cout << "ch = " << ch << " name=" << name << endl;
}
return 0;
}
- 结果为:
#CHENQI
+CHENHA
$
- cin和scanf配合,结果也不符合预期:
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
#define maxn 50001
char s[101];
int main()
{
freopen("1388.in", "r", stdin);
freopen("1388.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
int x, y, s1, s2, t, i, j, s;
int cnt = 0; //總輸入序號
char ch;
string name;
while (cin>>ch, ch != '$')
{
scanf("%s", s);
name = s;
cout << "ch = " << ch << " name=" << name << endl;
}
return 0;
}
- 结果为:
ch = # name=a
ch = C name=a
ch = H name=a
ch = E name=a
ch = N name=a
ch = Q name=a
ch = I name=a
ch = + name=a
ch = C name=a
ch = H name=a
ch = E name=a
ch = N name=a
ch = H name=a
ch = A name=a
- 以上代码,如果去除输入优化,直接运行错误。
- getchar和scanf配合,无论是否输入优化(没有cin和cout,输入输出优化没有意义),则scanf直接输入未知字符,不符合预期:
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
#define maxn 50001
char s[101];
int main()
{
freopen("1388.in", "r", stdin);
freopen("1388.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
int x, y, s1, s2, t, i, j, s;
int cnt = 0; //總輸入序號
char ch;
string name;
while (ch=getchar(), ch != '$')
{
scanf("%s", s);
name = s;
cout << "ch = " << ch << " name=" << name << endl;
}
return 0;
}
结果为:
ch = # name=
ch = C name=
ch = H name=
ch = E name=
ch = N name=
ch = Q name=
ch = I name=
ch = + name=
ch = C name=
ch = H name=
ch = E name=
ch = N name=
ch = H name=
ch = A name=