J'ai du mal à faire quelque chose dans mon programme. J'ai un tableau contenant des noms de personnes. J'ai un autre tableau char [28] qui conserve également des noms. Je demande à l'utilisateur d'entrer un nom pour le premier tableau, et le second tableau lit les noms d'un fichier binaire. Ensuite, je les compare avec == opérateur, mais même si les noms sont les mêmes, leurs valeurs sont différentes lorsque je le débogue pourquoi est-ce le cas? Comment puis-je comparer ces deux? Mon exemple de code est le suivant:
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;
}
}
En supposant que student::name
est un tableau char
ou un pointeur sur char
, l'expression suivante
sName==Student.name
compare les pointeurs à char
, après avoir décomposé sName
de char[28]
à char*
.
Étant donné que vous souhaitez comparer le conteneur de chaînes de caractères dans ces tableaux, une option simple consiste à lire les noms dans std::string
et à utiliser bool operator==
:
#include <string> // for std::string
std::string sName;
....
if (sName==Student.name)//Student.name is also an std::string
Cela fonctionnera pour les noms de toutes longueurs et vous évitera d'avoir à traiter des tableaux.
Vous pouvez comparer des tableaux de caractères supposés être des chaînes en utilisant la fonction c style strcmp .
if( strcmp(sName,Student.name) == 0 ) // strings are equal
En C++, normalement, vous ne travaillez pas directement avec des tableaux. Utilisez la classe std :: string à la place des tableaux de caractères et votre comparaison avec == fonctionnera comme prévu.
Le problème est dans if(sName==Student.name)
qui compare en gros l’adresse des tableaux, pas leurs valeurs.
Remplacez-le par (strcmp(sName, Student.name) == 0)
Mais en général, vous travaillez sur C++, pas C, je vous conseille de travailler avec std :: string, ce qui simplifiera beaucoup les choses.
si (sName == Student.name) compare les adresses
if( strcmp( sName, Student.name ) == 0 {
/ * the strings are the same */
}
Vous pouvez écrire du code pour votre propre fonction de comparaison de tableau de caractères. Commençons
//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;
}