C++ Сравнивает массив символов со строкой

Если столбцы являются числовыми, исправляют xls файл, рассматривающий тот столбец как текст.
Разве Вы не хотели бы, чтобы столбцы были структурно тем же при слиянии данных?

36
задан Chris Klepeis 25 August 2009 в 23:19
поделиться

4 ответа

Используйте strcmp () для сравнения содержимого строк:

if (strcmp(var1, "dev") == 0) {
}

Объяснение: в C строка - это указатель на ячейку памяти, которая содержит байты. Сравнение char * с char * с использованием оператора равенства не будет работать должным образом, потому что вы сравниваете ячеек памяти строк, а не их байтовое содержимое. Такая функция, как strcmp () , будет перебирать обе строки, проверяя их байты, чтобы убедиться, что они равны. strcmp () вернет 0, если они равны, и ненулевое значение, если они различаются. Для получения дополнительных сведений см. страницу руководства .

65
ответ дан 27 November 2019 в 05:32
поделиться

You're not working with strings. You're working with pointers. var1 is a char pointer (const char*). It is not a string. If it is null-terminated, then certain C functions will treat it as a string, but it is fundamentally just a pointer.

So when you compare it to a char array, the array decays to a pointer as well, and the compiler then tries to find an operator == (const char*, const char*).

Such an operator does exist. It takes two pointers and returns true if they point to the same address. So the compiler invokes that, and your code breaks.

IF you want to do string comparisons, you have to tell the compiler that you want to deal with strings, not pointers.

The C way of doing this is to use the strcmp function:

strcmp(var1, "dev");

This will return zero if the two strings are equal. (It will return a value greater than zero if the left-hand side is lexicographically greater than the right hand side, and a value less than zero otherwise.)

So to compare for equality you need to do one of these:

if (!strcmp(var1, "dev")){...}
if (strcmp(var1, "dev") == 0) {...}

However, C++ has a very useful string class. If we use that your code becomes a fair bit simpler. Of course we could create strings from both arguments, but we only need to do it with one of them:

std::string var1 = getenv("myEnvVar");

if(var1 == "dev")
{
   // do stuff
}

Now the compiler encounters a comparison between string and char pointer. It can handle that, because a char pointer can be implicitly converted to a string, yielding a string/string comparison. And those behave exactly as you'd expect.

19
ответ дан 27 November 2019 в 05:32
поделиться

В этом коде вы не сравниваете строковые значения, вы сравниваете значения указателя. Если вы хотите сравнить строковые значения, вам нужно использовать функцию сравнения строк, такую ​​как strcmp.

if ( 0 == strcmp(var1, "dev")) {
  ..
}
1
ответ дан 27 November 2019 в 05:32
поделиться

«dev» не является строкой , это const char * как var1 ]. Таким образом, вы действительно сравниваете адреса памяти. Поскольку var1 является указателем на char, * var1 является одиночным char (точнее, первым символом указанной последовательности символов). Вы не можете сравнить char с указателем char, поэтому это не сработало.

Поскольку он помечен как c ++, было бы разумно использовать std :: string вместо char указатели, которые заставят == работать должным образом. (Вам просто нужно сделать const std :: string var1 вместо const char * var1 .

0
ответ дан 27 November 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: