为什么此C ++程序适用于输入的第一行而不适用于第二行或第三行?

时间:2019-01-07 17:25:03

标签: c++ string vector io

如果给定的字符串包含“ ”或“ Real Fancy 的程序strong>”和 通常看中的 (如果其中不含)。

例如:“这不是字符串” o / p:真正的幻想

“这没什么” o / p:定期看中

问题是,如果我的第一个测试用例输入是“ 不是是此行”,它将打印Real Fancy。但是,如果在第二个或以上的测试用例中使用相同的行作为输入,则该行将无法正常工作并定期打印。有帮助吗?

代码如下:

export function pointReducer(state: 1, action: EnthusiasmAction) {
    switch (action.type) {
        case INCREMENT_ENTHUSIASM:
            return state + 1;
        case DECREMENT_ENTHUSIASM:
            return Math.max(1, state - 1);
        case GAME_TICK:
            return state + 1;
        default:
            return state;
    }
}

1 个答案:

答案 0 :(得分:0)

输入模式如下

t
quote
quote
quote
...

阅读t

cin>>t;

一旦找到可能不是整数的输入,就会停止。这包括表示行尾的换行符,并将换行符留在流中以供以后使用(有关该问题的更多信息,请参见Why does std::getline() skip input after a formatted extraction?)。跳过问题已通过

解决
cin.ignore();
getline(cin,quote);

while循环中,但这将一个错误换成了另一个。如果没有先前格式化的输入以在流中保留不需要的字符,则cin.ignore();将抛出输入的合法第一个字符。

这将在第二次及其后的读取中发生。输入将看起来像

t //newline consumed by ignore
quote //newline consumed by getline. ignore consumes first character of next line
uote //newline consumed by getline. ignore consumes first character of next line
uote //newline consumed by getline. ignore consumes first character of next line
..

解决方案:

将其移动到输入之后,将不需要的字符留在流中

cin>>t;
cin.ignore();

一个更好的选择是ignore,这样您就可以确定在行尾摆脱了所有潜在的垃圾

cin>>t;
cin.ignore(numeric_limits<streamsize>::max(), '\n');

这将从流中读取直到流的最大可能长度,或者找到并丢弃换行符,以先到者为准。

总是在手术后而不是下一次清理。它将相关的代码紧密地结合在一起,以提高可读性,并保护您免受之前没有清理的情况的侵害。