4

我是 C++ 的新手,如果这个问题真的很简单,我很抱歉。我正在用 C++ 编写一个程序,它掷骰子并显示它的数字,直到用户输入单词取消,但即使我输入取消,我的循环也不会结束.这是我的代码(我使用 dev 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;        
}
4

7 回答 7

6

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

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

您可以找到此处的文档和此处strcmp 文档std::string

于 2013-07-16T21:13:09.203 回答
3

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

于 2013-07-16T21:15:12.363 回答
2
  1. 你应该纠正

    }while(k!="cancel");
    

    进入

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

    或者更好的是,如果您已经在使用 C++,您可以使用标准字符串类

    这是strcmp 的参考,这里有一个比较两个 C++ 字符串的示例。

  2. 尝试多次掷骰子,然后您会意识到您得到了相同的随机值,因为用于播种随机性的 time() 在同一秒内运行时将返回同一秒。因此,您应该移动:

    srand(time(NULL));
    

    在 do while 循环之前进入你的 main 函数,你不需要掷骰子 100 次,你可以通过 dice 中的一行代码来克服:

    return (rand()% 6)+1;
    
于 2013-07-16T21:15:44.217 回答
1

!=对于原始字符串,它不会像您认为的那样做。它不比较字符串本身,只比较指针地址,这当然总是不同的。

strcmp在这种情况下使用。

于 2013-07-16T21:14:39.040 回答
0

您应该考虑使用 cin.getline 而不仅仅是 cin>>k,更具体地说,如果用户输入它们,这将考虑输入中的空格。

编辑:也正如许多其他人所提到的,您应该使用字符串而不是文字。

于 2013-07-16T21:14:14.337 回答
0

您应该使用strcmp函数来比较 C 风格的字符串:

 }while(strcmp(k, "cancel") != 0);
于 2013-07-16T21:15:18.167 回答
0

您不能像这样比较 char 字符串,只有 astd::string可以比较,因为您正在将“k”的指针与常量“cancel”的指针进行比较。您应该使用strncmp,但由于您使用的是 C++,因此您应该使用 a std:string

此外,如果用户输入的字符串长度超过 7 个字符,则会导致不可预知的行为,因为您将溢出缓冲区,使用std::string将避免这种情况。

于 2013-07-16T21:15:40.333 回答