0

このコードの問題は、エラーが表示されないことですが、プログラムをコンパイルすると、ifelseステートメントが正常に実行されません。両方のifステートメントは同じ答えを示します。たとえば、2番目のifステートメントです。YまたはNと入力すると、同じ結果が得られます。「イベントを選択します」。この問題を取り除くにはどうすればよいですか?charを使用するのですか、それともstringを使用するのですか?

#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を使用することに慣れたほうがよいでしょう。そしてそれはより直接的です。オプションがstd::stringの場合、「if」ステートメントは正しいはずです。

于 2012-05-03T22:28:53.883 に答える
3

(とは明らかに期待どおりに機能します)char []ではなく、本当に使用したい場合は、文字列比較を行う古いC-wayを使用するようにifステートメントを編集する必要があります。何かのようなもの:std::stringoperator==

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

または、1つの文字だけを比較しているので、次のことができます。

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

char []これにより、プリミティブ型である最初の文字へのポインターが逆参照されるため、。と直接比較できます==

于 2012-05-03T22:29:02.097 に答える
2

たとえば、

if (option=="N")

optionこれは、ポインタに減衰された、リテラルのアドレスと比較されます"N"。それは常にfalseを返します。C文字列の内容を比較するには、を使用する必要がありますstrcmp

自分自身に多大な恩恵を与えstd::string、C文字列の代わりに使用してください。

于 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;
。文字を格納するためのメモリのチャンクを予約します。変数バーは変数fooを指します。fooに格納されている値は、直接使用するか、変数バー(* bar)を逆参照することで取得できます。

charポインタ型で変数を宣言する場合:文字
char* foo
を格納するためのメモリのチャンクを格納するために、メモリのチャンクを予約しています。

しかし、私はポインターを作成しませんでした! C / C ++では、配列を暗黙的にポインターに変換できます。これは、作成したコードで実際に発生することではありませんが、次のように考えることができます。
char optionValue;
char* option = &optionValue;

ifステートメントが機能しないのはなぜですか?
ポインタを比較するときは、ポイントしているメモリのチャンクを他のポインタのメモリのチャンクと比較します。したがって、==は、2つのポインタが同じメモリチャンクを指している場合にのみtrueを返します。コードでは、これは不可能です。定数「N」は、コンパイラが作成したメモリのチャンクを指すポインタと同じになることはありません。

あなたがする必要があるのは、メモリのチャンクの内容を比較するか(他の人が提案したようにstrlenを使用して)、変数のタイプを変更することです(文字列は非常に一般的であるため、それらを処理するためのstd::stringタイプがあります)。

于 2012-05-03T22:47:28.133 に答える