所以,我刚刚开始学习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;
}
答案 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(),以及更好地构造代码的数组。