16

我在我的程序中做某事有问题。我有一个 char[28] 数组来保存人名。我还有另一个 char[28] 数组,它也保留名称。我要求用户输入第一个数组的名称,第二个数组从二进制文件中读取名称。然后我将它们与 == 运算符进行比较,但即使名称相同,当我调试时它们的值看起来也不同。为什么会这样?我如何比较这两者?我的示例代码如下:

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::name是一个char数组或一个指向 的指针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 回答
0

我无法发表评论,这是对 habib 比较字符串开头的答案的调整:

int compare(char a[], char b[]) {
    for(int i = 0; strlen(a) < strlen(b) ? a[i] != '\0' : b[i] != '\0'; i++) {
        if(a[i] != b[i])
            return 0;
    }
    return 1;
}

我需要这个来比较不包括 GET 参数的 webrequest 查询。

于 2022-01-29T20:12:25.773 回答