我的do-while循环没有结束

时间:2013-07-16 21:11:19

标签: c++ do-while

我是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;        
}

7 个答案:

答案 0 :(得分:6)

永远不会是真的,因为你比较指针而不是实际的字符串内容。你应该使用std::string的另一个原因(比较运算符将比较字符串本身)。

进行此比较的C方式是使用strcmp,C ++方式是使用std :: string并依赖它的比较运算符(即operator==)。但由于这是标记的C ++,我强烈建议您使用std::string

您可以找到strcmp here的文档和std::string here的文档。

答案 1 :(得分:3)

使用std :: strcmp函数。您只是将指针与字符串文字进行比较。但正如其他人所说,你真的应该使用std :: string。

答案 2 :(得分:2)

  1. 你应该纠正

    }while(k!="cancel");
    

    }while(strcmp(k,"cancel")!=0);
    

    或更好,如果您已经在使用C ++

    ,则可以使用标准字符串类

    以下是reference for strcmp ,此处您有comparing two C++ strings的示例。

  2. 尝试多次掷骰子,然后你意识到你得到了相同的随机值,因为用于种子随机性的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将避免这种情况。