C ++: Как сделать функцию сравнения для массивов символов? - PullRequest
2 голосов
/ 12 января 2011

Возможно ли это?я получаю странное сообщение об ошибке, когда я помещаю char как тип:

inline bool operator==(const char *str1, const char *str2){
    // ...
}

Сообщение об ошибке: error C2803: 'operator ==' must have at least one formal parameter of class type ... что я совсем не понимаю.

Я думал, смогу ли янапрямую сравнивать такие вещи, как:

const char *str1 = "something";
const char *str2 = "something else";
const char str3[] = "lol"; // not sure if this is same as above

, а затем сравнивать:

if(str1 == str2){
   // ...
}

и т. д.

Но я также хочу, чтобы он работал с:

char *str = new char[100];

и:

char *str = (char *)malloc(100);

Я предполагаю, что каждый массив символов, который я использую таким образом, заканчивается символом NULL, поэтому проверка должна быть возможной, но я понимаю, что это может быть небезопасно и т. Д. Я просто хочузнать, возможно ли это сделать и как.

Ответы [ 6 ]

7 голосов
/ 12 января 2011

Это невозможно. Как указывает ваш компилятор, вы не можете перегрузить этот оператор для примитивных типов данных. По крайней мере одна сторона сравнения должна быть непримитивной, чтобы была возможна перегрузка.

В том же смысле вы не можете получить новый класс из примитивного типа данных (чтобы добавить к нему функциональность).

4 голосов
/ 12 января 2011

Вы пытаетесь сравнить два указателя.

const char* str1 = "string1";
const char* str2 = "string1";

if(str1 == str2) // never true, str1 is not the same pointer as str2
{
};

Но вы предоставили тег C ++, поэтому вам следует использовать std::string:

#include <string>

std::string str1 = "string1";
std::string str2 = "string1";

if(str1 == str2)  // yes!  std::string overloads operator ==
{
}
3 голосов
/ 12 января 2011

Указатели являются встроенными типами.Для них уже есть встроенные операторы сравнения, вы не можете их переопределить.Просто используйте std::string.

0 голосов
/ 11 января 2012

Используйте strcmp() для сравнения символов: он работает с указателями символов char * и массивами символов char [ ].

#include <string.h>
#include <stdio.h>

char *string_Char_pointer1 = {"2012-12-06 14:28:51"};
char *string_Char_pointer2 = {"1911-12-06 14:28:51"};

char string_Char_Array1[] = "2012-12-06 14:28:51";
char string_Char_Array2[] = "1911-12-06 14:28:51";

int main( void )
{
   char tmp[20];
   int result;

   printf( "Comparing  string_Char_pointer..\n\n\n");

   printf( "Compared strings:\n   %s\n   %s\n\n\n", string_Char_pointer1, string_Char_pointer2 );
   result = strcmp( string_Char_pointer1, string_Char_pointer2 );

   if( result > 0 )        strcpy( tmp, "greater than" );
   else if( result < 0 )   strcpy( tmp, "less than" );
   else    strcpy( tmp, "equal to" );

   printf( "   strcmp:   String 1 is %s string 2\n\n", tmp );

   printf( "\n\nComparing string_Char_Array..\n\n");

   printf( "Compared strings:\n   %s\n   %s\n\n\n", string_Char_Array1, string_Char_Array2 );
   result = strcmp( string_Char_pointer1, string_Char_pointer2 );

   if( result > 0 )        strcpy( tmp, "greater than" );
   else if( result < 0 )   strcpy( tmp, "less than" );
   else    strcpy( tmp, "equal to" );




   return 0;
}
0 голосов
/ 12 января 2011

Вы наверняка можете написать свою собственную функцию сравнения, и на самом деле это одна из самых простых вещей, которую нужно сделать. Я понятия не имею, почему кто-то скажет, что ты не можешь. Вы просто не можете назвать это operator =. Вот это (не проверено):

int my_strcmp(char const* s1, char const* s2)
{
  for(;*s1 == *s2 && *s1; ++s1,++s2);

  return *s1 - *s2;
}

...
if (!my_strcmp(str1, str2)) // they're ==.
0 голосов
/ 12 января 2011

Решил, что мой комментарий будет лучше в качестве ответа, для этого вы должны использовать стандартные функции string (strncmp, strncat и т. Д.).

Редактировать: Как указано в другомответ, вы не можете сделать перегрузку.Но в случае массивов символов и указателей символов следует использовать стандартные библиотечные функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...