16

プログラムで何かをすることに問題があります。人の名前を保持する 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;
    }
}
4

6 に答える 6

21

C スタイルのstrcmp関数を使用して、文字列であると想定される char 配列を比較できます。

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

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

于 2013-02-24T10:26:53.610 に答える
10

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

sName==Student.name

からへchar減衰した後、へのポインタを比較します。sNamechar[28]char*

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

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

std::string sName;
....

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

これは、任意の長さの名前に対して機能し、配列を扱う手間を省きます。

于 2013-02-24T10:24:19.610 に答える
7

if( sName == Student.name ) はアドレスを比較しています

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

ただし、strcmpには注意してください

于 2013-02-24T10:26:11.637 に答える
5

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

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

于 2013-02-24T10:26:53.010 に答える
1

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

//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;
}
于 2017-07-19T00:55:16.293 に答える