web-dev-qa-db-fra.com

Comparaison des valeurs des tableaux de caractères en C++

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;
    }
}
7
yrazlik

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.

7
juanchopanza

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.

14
nvoigt

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.

4
Roee Gavirel

si (sName == Student.name) compare les adresses

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

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;
}
0
habib