在C ++中使用cin的问题

时间:2013-07-06 12:26:47

标签: c++

所以,我刚刚开始学习c ++,而且我一直在看一些教程等等。我写了一个小程序,应该像魔术八球一样,但是我对cin命令有些麻烦。我写过cin>> X;其中x是一个字符串,当用户输入他们的问题时,该程序应该打印一个随机响应。听起来很简单,但如果用户在问题中键入多个单词,则会打印多个响应。所以,如果我输入“我会活到100岁吗?”我得到了6个答案,而不是1个。这是我的代码:(我确定它可能很乱,而且组织或编码不是很有效,就像我说的,我是初学者。)

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

string z = "Yes";
string b = "Signs point to yes";
string c = "It is certain";
string d = "It is decidedly so";
string e = "Without a doubt";
string f = "Yes, definitely";
string g = "You may rely on it";
string h = "As I see it yes";
string i = "Most likely";
string j = "Outlook good";
string k = "Reply hazy try again";
string l = "Ask again later";
string m = "Better not tell you now";
string n = "Cannot predict now";
string o = "Concentrate and ask again";
string p = "Don't count on it";
string q = "My reply is no";
string r = "My sources say no";
string s = "Outlook not so good";
string t = "Very doubtful";
string u;

int main()
{
    srand(time(0));

    cout << "Ask A Question" << endl << endl << "Type 'Exit' to end the program" << endl <<           endl;
    int a = 1+(rand()% 20);
    cin >> u;

if (u == "Exit"){
    return 0;
}
if (u == "exit"){
    return 0;
}



if (a == 1){
    cout << z << endl << endl;
    main();
}
if (a == 2){
    cout << b << endl << endl;
    main();
}
if (a == 3){
    cout << c << endl << endl;
    main();
}
if (a == 4){
    cout << d << endl << endl;
    main();
}
if (a == 5){
    cout << e << endl << endl;
    main();
}
if (a == 6){
    cout << f << endl << endl;
    main();
}
if (a == 7){
    cout << g << endl << endl;
    main();
}
if (a == 8){
    cout << h << endl << endl;
    main();
}
if (a == 9){
    cout << i << endl << endl;
    main();
}
if (a == 10){
    cout << j << endl << endl;
    main();
}
if (a == 11){
    cout << k << endl << endl;
    main();
}
if (a == 12){
    cout << l << endl << endl;
    main();
}
if (a == 13){
    cout << m << endl << endl;
    main();
}
if (a == 14){
    cout << n << endl << endl;
    main();
}
if (a == 15){
    cout << o << endl << endl;
    main();
}
if (a == 16){
    cout << p << endl << endl;
    main();
}
if (a == 17){
    cout << q << endl << endl;
    main();
}
if (a == 18){
    cout << r << endl << endl;
    main();
}
if (a == 19){
    cout << s << endl << endl;
    main();
}
if (a == 20){
    cout << t << endl << endl;
    main();
}


    return 0;
}

4 个答案:

答案 0 :(得分:10)

问题是你一遍又一遍地(递归地)调用main()以便让用户提出另一个问题。但是,您没有考虑std::cin在遇到空格时停止提取字符串,因此您最终会在用户输入中进行与空格分隔的单词一样多的重复。


除了这个问题,代码太可怕了。对不起,它只是:

予。您声明了20个(左右)变量和一大堆if s而不是std::vector<std::string>。如果您有更多元素或者您不知道项目数,这将很快变得无法维护。

II。你递归地调用main(),这是合法但非法和邪恶并且显示非常糟糕的编程风格。只是不要这样做。改为使用循环(迭代)。

III。你是abusing namespace std;也是不鼓励的。

IV。你也没有充分的理由使用全局变量。

总而言之,您应该重写您的程序,使其显示如下:

#include <vector>
#include <iostream>
#include <cstdlib>
#include <ctime>

int main()
{
    std::vector<std::string> v;

    v.push_back("Yes");
    v.push_back("Signs point to yes");
    v.push_back("It is certain");
    v.push_back("It is decidedly so");
    v.push_back("Without a doubt");
    v.push_back("Yes, definitely");
    v.push_back("You may rely on it");
    v.push_back("As I see it yes");
    // etc.

    char q[0x100] = { 0 };

    while (true) {
        std::srand(std::time(nullptr));
        int idx = rand() % v.size(); // this isn't perfect either, by the way

        std::cout << "Ask a question:" << std::endl;

        std::cin.getline(q, sizeof(q));
        if (std::string(q) == "exit")
            break;

        std::cout << v[idx] << std::endl;
    }

    return 0;
}

繁荣,它只有37行而不是128行,并且它具有很强的可读性。

答案 1 :(得分:4)

cin读取字符串,直到达到空格为止"Will I live to be 100?"包含6个字符串。

为了避免您的问题,请使用getline

此外,您最好将20个字符串变量更改为单个数组或字符串向量。在这种情况下,您的main()也会看起来更好,因为您最终只会有一个if状态,它会根据随机值访问数组\向量的元素。

此外,您应该将全局变量移至main()并将代码插入while循环中,该循环将具有以下条件while (cin >> u && u != "exit")(仅保留变量声明和{{1}在循环之外)

This回答显示了您的计划实际上应该是什么样子。

答案 2 :(得分:1)

使用getline阅读完整的一行

答案 3 :(得分:0)

这里的问题,可以说是其他问题,就是cin在遇到空格时就会停止,你的stdin已经缓存了整个问题(行),所以下次你调用cin实际上它会读取你在stdin中的内容缓冲液中。

您应该考虑使用getline函数,该函数读取直到换行符/回车符。

getline(cin,u);

您还应该考虑学习循环,不再调用main(),以及更好地构造代码的数组。