PAT wifi密码1076题 输入问题

第一次代码如下

 #include <iostream>
using std::cin;
using std::cout;
using std::endl;

int main()
{
    int N;
    cin >> N;
    char choice;//A or B or C or D
    char answer;//T or F
    int count = 0;
    int flag[100] = {0};
    while (N--)
    {
        for (int i = 0; i < 4; i++)
        {
            scanf("%c-%c", &choice, &answer);
            if (answer == 'T')
            {
                flag[count] = choice - 'A' + 1;//转化1234
                count++;
            }
        }
    }

    for (int i = 0; i < count; i++)
    {
        cout << flag[i];
    }
    return 0;
}

输入有问题,只输入四次就终止,结果都是错误的

#include <iostream>
#include <stdio.h>
using std::cin;
using std::cout;
using std::endl;

int main()
{
    int N;
    cin >> N;
    char choice;//A or B or C or D
    char answer;//T or F
    int count = 0;
    int flag[100] = {0};
    N = 4 * N;
    while (N--)
    {

            scanf("%c-%c", &choice, &answer);
            if (answer == 'T')
            {
                flag[count] = choice - 'A' + 1;
                count++;
            }
    }

    for (int i = 0; i < count; i++)
    {
        cout << flag[i];
    }
    return 0;
}

还是同样的问题:
输入如下
8
A-T B-F C-F D-F
C-T B-F A-F D-F
B-T A-F C-F D-F
B-F D-T A-F D-F

这样输入,没有结果
请不要给我复制一些正确答案,我看过了,只是不懂为什么我的输入方法有问题,错在哪儿?感谢!

#include
using std::cin;
using std::cout;
using std::endl;

int main()
{
int N;
cin >> N;
char choice;//A or B or C or D
char answer;//T or F
int count = 0;
int flag[100] = {0};
N = 4 * N;
while (N--)
{

        scanf("%c-%c", &choice, &answer);
        if (answer == 'T')
        {
            flag[count] = choice - 'A' + 1;
            count++;
        }
}

for (int i = 0; i < count; i++)
{
    cout << flag[i];
}
return 0;

}


这是博主的代码!!
只需要修改一行代码就可以正确运行了,代码地19行的scanf("%c-%c", &choice, &answer); 这句改为scanf(**"%c-%c "**, &choice, &answer)
注意scanf引里面需要加上一个空格。
愿意解释:在输入的时候给定的输入格式是:
8
A-T B-F C-F D-F
这里四个输入中间是由空格分割开的,scanf在读取的时候若没有接收到回车就会把输入的内容都放在缓存区里,当接受回车之后从缓存区里读数据,按照博主的读取格式首“A”会放入choice,之后“-”不会读取,之后“T”会放入answer, 紧接着缓存里面存的并不是“B”,而是“ ”(空格),以下一次choice里面存的就是“ “(空格)这样一来后面就全乱套了。
下面贴出我微微改过的代码
#include
#include
using std::cin;
using std::cout;
using std::endl;

int main()
{
int N;
cin >> N;
//getchar();
char choice;//A or B or C or D
char answer;//T or F
int count = 0;
int flag[100] = {0};
N = 4 * N;
while (N--)
{
scanf("%c-%c ", &choice, &answer); //注意这里加了一个空格
if (answer == 'T')
{
flag[count] = choice - 'A' + 1;
count++;
}
}

for (int i = 0; i < count; i++)
{
    cout << flag[i];
}
return 0;

}

忘记放原题
1076. Wifi密码 (15)
下面是微博上流传的一张照片:“各位亲爱的同学们,鉴于大家有时需要使用wifi,又怕耽误亲们的学习,现将wifi密码设置为下列数学题答案:A-1;B-2;C-3;D-4;请同学们自己作答,每两日一换。谢谢合作!!~”—— 老师们为了促进学生学习也是拼了…… 本题就要求你写程序把一系列题目的答案按照卷子上给出的对应关系翻译成wifi的密码。这里简单假设每道选择题都有4个选项,有且只有1个正确答案。
输入格式:

输入第一行给出一个正整数N(<= 100),随后N行,每行按照“编号-答案”的格式给出一道题的4个选项,“T”表示正确选项,“F”表示错误选项。选项间用空格分隔。

输出格式:

在一行中输出wifi密码。

输入样例:
8
A-T B-F C-F D-F
C-T B-F A-F D-F
A-F D-F C-F B-T
B-T A-F C-F D-F
B-F D-T A-F C-F
A-T C-F B-F D-F
D-T B-F C-F A-F
C-T A-F B-F D-F
输出样例:
13224143

https://blog.csdn.net/xnh_565175944/article/details/78804294

换行时候的\n,选项之间的空格,你要在%c前加空格来处理,否则输入就那两个字符会捣乱

#include
#include
using std::cin;
using std::cout;
using std::endl;

int main()
{
int N;
cin >> N;
char choice;//A or B or C or D
char answer;//T or F
int count = 0;
int flag[100] = { 0 };
N = 4 * N;

cin.ignore();           //过滤回车

while (N--)
{

    scanf("%c-%c", &choice, &answer);

    cin.ignore();                           //过滤每次输入的空格


    if (answer == 'T')
    {
        flag[count] = choice - 'A' + 1;
        count++;
    }
}

for (int i = 0; i < count; i++)
{
    cout << flag[i];
}
return 0;

}

主要添加了两个cin.ignore();仔细观察。

你代码问题忽略了输入过程中产生的/r/n/space。缓冲区残留了大量此字符。故忽略即可。

图片说明

图片说明

图片说明