Если столбцы являются числовыми, исправляют xls файл, рассматривающий тот столбец как текст.
Разве Вы не хотели бы, чтобы столбцы были структурно тем же при слиянии данных?
Используйте strcmp ()
для сравнения содержимого строк:
if (strcmp(var1, "dev") == 0) {
}
Объяснение: в C строка - это указатель на ячейку памяти, которая содержит байты. Сравнение char *
с char *
с использованием оператора равенства не будет работать должным образом, потому что вы сравниваете ячеек памяти строк, а не их байтовое содержимое. Такая функция, как strcmp ()
, будет перебирать обе строки, проверяя их байты, чтобы убедиться, что они равны. strcmp ()
вернет 0, если они равны, и ненулевое значение, если они различаются. Для получения дополнительных сведений см. страницу руководства .
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.
В этом коде вы не сравниваете строковые значения, вы сравниваете значения указателя. Если вы хотите сравнить строковые значения, вам нужно использовать функцию сравнения строк, такую как strcmp.
if ( 0 == strcmp(var1, "dev")) {
..
}
«dev» не является строкой
, это const char *
как var1
]. Таким образом, вы действительно сравниваете адреса памяти. Поскольку var1
является указателем на char, * var1
является одиночным char (точнее, первым символом указанной последовательности символов). Вы не можете сравнить char с указателем char, поэтому это не сработало.
Поскольку он помечен как c ++, было бы разумно использовать std :: string
вместо char указатели, которые заставят == работать должным образом. (Вам просто нужно сделать const std :: string var1
вместо const char * var1
.