web-dev-qa-db-ja.com

C ++でのchar配列の値の比較

プログラムで何かをすることに問題があります。人の名前を保持するchar [28]配列があります。名前も保持する別のchar [28]配列があります。最初の配列の名前を入力するようにユーザーに要求し、2番目の配列はバイナリファイルから名前を読み取ります。次に、それらを==演算子で比較しますが、名前は同じですが、デバッグすると値が異なって見えます。これはなぜですか?これら2つを比較するにはどうすればよいですか?私のサンプルコードは次のとおりです:

int main()
{
    char sName[28];
    cin>>sName;      //Get the name of the student to be searched

      /// Reading the tables

    ifstream in("students.bin", ios::in | ios::binary);

    student Student; //This is a struct

    while (in.read((char*) &Student, sizeof(student)))
    {
    if(sName==Student.name)//Student.name is also a char[28]
    {
                cout<<"found"<<endl;
        break;
    }
}
11
yrazlik

student::namechar配列またはcharへのポインターであるとすると、次の式

sName==Student.name

charchar[28]からchar*に減衰させた後、ポインタをsNameと比較します。

これらの配列の文字列コンテナーを比較する場合、名前を std::string に読み込んでbool operator==を使用するのが簡単なオプションです。

#include <string> // for std::string

std::string sName;
....

if (sName==Student.name)//Student.name is also an std::string

これは、任意の長さの名前で機能し、配列を処理する手間を省きます。

7
juanchopanza

文字列であるはずのchar配列を比較するには、cスタイル strcmp 関数を使用します。

if( strcmp(sName,Student.name) == 0 ) // strings are equal

C++では、通常、配列を直接操作することはありません。文字配列の代わりに std :: string クラスを使用すると、==との比較が期待どおりに機能します。

15
nvoigt

問題はif(sName==Student.name)にあり、基本的には配列の値ではなく配列のアドレスを比較します。
(strcmp(sName, Student.name) == 0)に置き換えます

しかし、一般的には、CではなくC++で作業しているので、std :: stringを使用すると作業が簡単になります。

5
Roee Gavirel

if(sName == Student.name)が住所を比較しています

if( strcmp( sName, Student.name ) == 0 { 
  / * the strings are the same */
}

Strcmpにも注意してください

3
pahoughton

独自の文字配列比較関数のコードを記述できます。はじめましょう

//Return 0 if not same other wise 1
int compare(char a[],char b[]){
    for(int i=0;a[i]!='\0';i++){
        if(a[i]!=b[i])
            return 0;
    }
    return 1;
}
1
habib