0

这段代码的问题是没有显示错误,但是当我编译程序时,if else 语句没有按应有的方式执行。两个 if 语句显示相同的答案,例如第二个 if 语句。如果我输入 Y 或 N,我会得到相同的结果,“你现在将选择一个事件”。我该如何摆脱这个问题?应该使用char还是字符串?

#include <iostream>
#include <iomanip>
#include<stdlib.h>
class start
{
public :
    void getusertype ();
    void registeruser ();
    start(); 
protected :
    char consumer_name[20],
    consumer_address[30],
    consumer_email[30];
    char user[8];
};

start::start()
{
    char terminator;
    cout <<"Are you the venue manager, consumer or ticket agent?";
    cin.get(user,8);
    cin.get(terminator);

}
void start::getusertype ()
{
    char terminator;
    if(user[8])
    {
        cout <<"You have now entered the system." <<endl <<endl;
        cin.get(terminator);

    }
    else
    {
        cout <<"You can only enter this part of the system if you are a consumer.";
    }

    }
void start::registeruser()
{
    char option[1];
    cout <<"Are you registered? (Enter Y/N)";
    cin.get(option,1);
    if (option=="N")
    { char terminator;
        cout <<"Please enter your registration details" <<endl <<endl;
        cout << " Enter your full name: " <<endl;
        cin.get (consumer_name,20);
        cin.get(terminator);
        cout <<"Enter your address: " <<endl;
        cin.get(consumer_address,30);
        cin.get(terminator);
        cout <<"Enter your email address: " <<endl;
        cin.get(consumer_email,30);
        cin.get(terminator);
    }
    else
    {
        cout <<"You will now choose an event.";
    }
}
4

6 回答 6

3

char option[1]; ... if (option=="N")

'if' 语句将选项数组的地址与常量字符串的地址进行比较;他们永远不会平等。

用 C 风格编写,你可以写一些类似的东西if (strcmp(option, "N") == 0)或其他一些东西。但习惯于在 C++ 代码中使用 std::string 会更好;而且更直接。如果 option 是 std::string,则您的“if”语句将是正确的。

于 2012-05-03T22:28:53.883 回答
3

如果你真的想使用char []而不是std::string(它有一个operator==并且显然更像你期望的那样),你需要编辑你的if语句以使用旧的 C 方式进行字符串比较。就像是:

if ( strcmp(option, "N") == 0)
{
  // ...
}

或者由于您只比较一个字符,您可以这样做:

if ( *option == 'N' )
{
  // ...
}

这取消了指向原始类型char []中第一个字符的指针,因此可以直接与.==

于 2012-05-03T22:29:02.097 回答
2

举个例子

if (option=="N")

这将option衰减为指针,与文字的地址进行比较"N"。那将始终返回错误。要比较 C 字符串的内容,您需要使用strcmp.

帮自己一个大忙,用std::stringC 字符串代替。

于 2012-05-03T22:29:00.373 回答
1

您正在使用“C”字符串 - 一天结束只是指针。因此,您需要使用该功能strcmp- 但std::strings 会省去麻烦。

于 2012-05-03T22:31:00.517 回答
0

我该如何摆脱这个问题?

停止使用字符数组。

我在哪里调用 std::string ?

像这样:

#include <iostream>
#include <iomanip>
#include <string>
#include <limits>

class start
{
public :
    void getusertype ();
    void registeruser ();
    start(); 
protected :
    std::string consumer_name;
    std::string consumer_address;
    std::string consumer_email;
    std::string user;
};

start::start()
{
    std::cout <<"Are you the venue manager, consumer or ticket agent?";
    std::getline(std::cin, user);

}
void start::getusertype ()
{
    if(user == "consumer")
    {
        std::cout <<"You have now entered the system.\n\n";
    }
    else
    {
        std::cout <<"You can only enter this part of the system if you are a consumer.\n";
    }

}
void start::registeruser()
{
    std::string option;
    std::cout <<"Are you registered? (Enter Y/N)";
    std::cin >> option;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    if (option=="N")
    { 
        std::cout <<"Please enter your registration details\n\n";
        std::cout << " Enter your full name: \n";
        std::getline(std::cin, consumer_name);
        std::cout <<"Enter your address: \n";
        std::getline(std::cin, consumer_address);
        std::cout <<"Enter your email address: \n";
        std::getline(std::cin, consumer_email);
    }
    else
    {
        std::cout <<"You will now choose an event.\n";
    }
}
于 2012-05-04T03:46:42.647 回答
0

要理解为什么这不起作用,您需要了解一些关于指针如何工作的事情。

什么是指针?
指针是一种指向值的类型。因此,当您声明一个 char 类型的变量时:
char foo; char* bar = &foo;
您正在保留一块内存来存储一个字符。变量 bar 指向变量 foo。您可以通过直接使用它或取消引用变量 bar (*bar) 来获取存储在 foo 中的值。

当您声明具有 char 指针类型的变量时:
char* foo
您正在保留一块内存来存储一块内存来存储一个字符。

但我从来没有做过指针! 在 C/C++ 中,数组可以隐式转换为指针。这不是您编写的代码实际发生的情况,但您可以这样想:
char optionValue;
char* option = &optionValue;

为什么我的 if 语句不起作用?
当您比较指针时,您会将您指向的内存块与另一个指针的内存块进行比较。所以 == 只有当两个指针指向同一个内存块时才会返回 true。在您的代码中,这是不可能的:常量“N”永远不会与指向编译器为您创建的内存块的指针相同。

您需要做的是比较内存块的内容(通过使用其他人建议的 strlen )或更改变量的类型(字符串很常见,因此有一个 std::string 类型来处理它们)。

于 2012-05-03T22:47:28.133 回答