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