我是c ++的新手很抱歉,如果这个问题非常简单。我正在用c ++编写一个程序来掷骰子并显示它的数字,直到用户输入单词取消,但我的即使我输入取消,循环也不会结束。我的代码(我使用开发c ++):
#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
int dice (int);
int main()
{
char k[7];
int x;
do
{
cout<<"your dice number is: "<<dice(x)<<endl;
cout<<"do you want to cancel or continue?";
cin>>k;
}while(k!="cancel");
cout<<"END";
getch();
}
int dice (int a)
{
srand(time(NULL));
for(int i=1;i<100;i++)
{
a=(rand()% 6)+1;
}
return a;
}
答案 0 :(得分:6)
永远不会是真的,因为你比较指针而不是实际的字符串内容。你应该使用std::string
的另一个原因(比较运算符将比较字符串本身)。
进行此比较的C方式是使用strcmp
,C ++方式是使用std :: string并依赖它的比较运算符(即operator==
)。但由于这是标记的C ++,我强烈建议您使用std::string
。
答案 1 :(得分:3)
使用std :: strcmp函数。您只是将指针与字符串文字进行比较。但正如其他人所说,你真的应该使用std :: string。
答案 2 :(得分:2)
你应该纠正
}while(k!="cancel");
到
}while(strcmp(k,"cancel")!=0);
或更好,如果您已经在使用C ++
,则可以使用标准字符串类以下是reference for strcmp ,此处您有comparing two C++ strings的示例。
尝试多次掷骰子,然后你意识到你得到了相同的随机值,因为用于种子随机性的time()在同一秒内运行时将返回相同的秒。所以你应该搬家:
srand(time(NULL));
在do while循环之前进入你的main函数,并且你不需要掷骰子100次,你可以通过骰子中的一行代码来克服:
return (rand()% 6)+1;
答案 3 :(得分:1)
!=
不会按照您的想法执行。它不会比较字符串本身,只是指针地址,当然它们总是不同。
在这种情况下使用strcmp
。
答案 4 :(得分:0)
你应该考虑使用cin.getline而不仅仅是cin&gt;&gt; k,更具体地说,如果用户输入它们,这将考虑输入中的空格。
编辑:正如许多其他人所提到的,你应该使用字符串而不是文字。
答案 5 :(得分:0)
您应该使用strcmp函数来比较C样式字符串:
}while(strcmp(k, "cancel") != 0);
答案 6 :(得分:0)
你不能比较那样的char字符串,只有std::string
可以用这种方式进行比较,因为你要将'k'的指针与常量“cancel”的指针进行比较。您应该使用strncmp
,但由于您使用的是C ++,因此您应该使用std:string
。
此外,如果用户输入的字符串长度超过7个字符,则会导致不可预测的行为,因为您将溢出缓冲区,使用std::string
将避免这种情况。