-1

所以,我刚刚开始学习c++,我一直在看一些教程等。我写了一个小程序,应该像一个魔术八球一样,但是我在使用cin命令时遇到了一些问题。我写了 cin >> x; 其中 x 是一个字符串,当用户键入他们的问题时,程序应该打印一个随机响应。听起来很简单,但如果用户在问题中输入超过 1 个单词,则会打印超过 1 个响应。所以,如果我输入“我会活到 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

4 回答 4

10

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


除了这个问题,代码很糟糕。对不起,它只是:

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

二、您正在main()递归调用,这是合法但非法和邪恶的,并且显示出非常糟糕的编程风格。只是不要这样做。请改用循环(迭代)。

三、你也是abusing namespace std;其中的气馁。

四。您还没有充分理由使用全局变量。

总而言之,你应该重写你的程序,让它看起来像这样:

#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 行,而且可读性很强。

于 2013-07-06T12:40:15.533 回答
4

cin读取一个字符串,直到到达空间,所以基本上"Will I live to be 100?"包含6字符串。

为了避免您的问题使用getline

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

此外,您应该将全局变量移动到循环中并将main()代码插入到while具有以下条件的循环中while (cin >> u && u != "exit")(仅保留变量声明并srand(time(0));在循环之外)

这个答案显示了您的程序实际上应该是什么样子。

于 2013-07-06T12:30:23.533 回答
1

使用getline读取完整的行

于 2013-07-06T12:30:08.630 回答
0

这里的问题,可以说是其他问题,是 cin 在遇到空格时停止,并且您的标准输入已经缓冲了整个问题(行),所以下次您调用 cin 实际上它会读取您在标准输入缓冲区中的内容。

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

getline(cin,u);

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

于 2013-07-06T12:35:28.633 回答