ti-enxame.com

Comparando os valores de matrizes de caracteres em C ++

Estou com problemas para fazer algo no meu programa. Eu tenho uma matriz de caracteres [28] mantendo nomes de pessoas. Eu tenho outra matriz de caracteres [28] que também mantém nomes. Peço ao usuário que digite um nome para a primeira matriz e a segunda matriz lê nomes de um arquivo binário. Então eu os comparo com o operador ==, mas mesmo que os nomes sejam iguais, seus valores parecem diferentes quando eu depuro. Por que esse é o caso? Como posso comparar esses dois? Meu código de exemplo é o seguinte:

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

Assumindo student::name é uma matriz char ou um ponteiro para char, a seguinte expressão

sName==Student.name

compara os ponteiros com char, depois de deteriorar sName de char[28] para char*.

Como você deseja comparar o contêiner de strings nessas matrizes, uma opção simples é ler os nomes em std::string e use bool operator==:

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

std::string sName;
....

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

Isso funcionará para nomes de qualquer tamanho e poupa o trabalho de lidar com matrizes.

7
juanchopanza

Você pode comparar matrizes de caracteres que deveriam ser seqüências de caracteres usando a função c style strcmp .

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

Em C++, você normalmente não trabalha com matrizes diretamente. Use a classe std :: string em vez de matrizes de caracteres e sua comparação com == funcionará conforme o esperado.

15
nvoigt

O problema está em if(sName==Student.name), que basicamente compara o endereço das matrizes, não seus valores.
Substitua por (strcmp(sName, Student.name) == 0)

Mas, em geral, você está trabalhando em C++, não em C, eu recomendaria trabalhar com std :: string, o que tornará isso muito mais simples.

5
Roee Gavirel

se (sName == Student.name) estiver comparando os endereços

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

Tenha cuidado com o strcmp

3
pahoughton

Você pode escrever código para sua própria função de comparação de matriz de caracteres. Vamos começar

//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