如何在c ++的if语句中使用字符串?

时间:2012-05-03 22:23:42

标签: c++

此代码的问题在于没有显示错误,但是当我编译程序时,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.";
    }
}

6 个答案:

答案 0 :(得分:3)

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

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

用C风格书写,你可以写一些像if (strcmp(option, "N") == 0)或其他几样东西。但是习惯在C ++代码中使用std :: string会更好;它更直接。如果option是std :: string,那么'if'语句就是正确的。

答案 1 :(得分:2)

举个例如

if (option=="N")

option(已衰减到指针)与文字"N"的地址进行比较。那将永远是假的。要比较C字符串的内容,您需要使用strcmp

给自己一个巨大的帮助并使用std::string而不是C字符串。

答案 2 :(得分:2)

如果您真的想使用char []而不是std::string(其operator==并且显然更符合您的预期),则需要修改 if 语句使用旧的C-way进行字符串比较。类似的东西:

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

或者因为你只比较一个你可以做的角色:

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

这解除了指向char []primitive type的第一个字符的指针,因此可以直接与==进行比较。

答案 3 :(得分:1)

你正在使用'C'字符串 - 那天结束时只是指针。所以你需要使用函数strcmp - 但std::string将节省麻烦。

答案 4 :(得分:0)

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

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

使用char指针声明变量时:
char* foo
您正在保留一大块内存来存储一块内存来存储角色。

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

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

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

答案 5 :(得分: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";
    }
}