プログラムで何かをすることに問題があります。人の名前を保持する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;
}
}
student::name
がchar
配列またはchar
へのポインターであるとすると、次の式
sName==Student.name
char
をchar[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
これは、任意の長さの名前で機能し、配列を処理する手間を省きます。
文字列であるはずのchar配列を比較するには、cスタイル strcmp 関数を使用します。
if( strcmp(sName,Student.name) == 0 ) // strings are equal
C++では、通常、配列を直接操作することはありません。文字配列の代わりに std :: string クラスを使用すると、==との比較が期待どおりに機能します。
問題はif(sName==Student.name)
にあり、基本的には配列の値ではなく配列のアドレスを比較します。(strcmp(sName, Student.name) == 0)
に置き換えます
しかし、一般的には、CではなくC++で作業しているので、std :: stringを使用すると作業が簡単になります。
if(sName == Student.name)が住所を比較しています
if( strcmp( sName, Student.name ) == 0 {
/ * the strings are the same */
}
Strcmpにも注意してください
独自の文字配列比較関数のコードを記述できます。はじめましょう
//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;
}