C++中,cin 、scanf 和 getchar 配合输入字符串的问题

  • 发现一个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=

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值