Сравнение двух char* на равенство

Возможный дубликат:
Какая функция подходит для сравнения двух строк в стиле C?

Мое условие совпадения не работает! Может кто-нибудь посоветовать, как сравнить строки в стиле C?

void saveData(string line, char* data){
    char *testString = new char[800];
    char *stpr;
    int i=0;
    bool isData=false;
    char *com = data;
    strcpy(testString,line.c_str());
        stpr = strtok(testString, ",");
        while (stpr != NULL) {
            string temp = stpr;
            cout << temp << " ===== " << data << endl;

Несмотря на то, что temp и data совпадают, следующее условие не работает:

if (stpr==data) {
  isData = true; 
}

Не уверен, что это поможет. Функция SaveData() вызывается из функции ниже:

void readFile(char* str){
    string c="", line, fileName="result.txt", data(str);
        ifstream inFile;
    inFile.open(fileName.c_str());
    resultlist.clear();

    if(inFile.good()){    
        while(!inFile.eof()){
            getline(inFile, line);
            if(line.find(data)!=string::npos){
                cout << line << endl;
            }
            saveData(line, str);
        }
        inFile.close();
    }

}

person Bryan Wong    schedule 25.11.2012    source источник
comment
Извините, это моя ошибка. Он сравнивает 2 символа *   -  person Bryan Wong    schedule 25.11.2012


Ответы (3)


Поскольку и stpr, и data являются строками C, вам необходимо использовать strcmp():

#include <string.h>
...
if (strcmp(stpr, data) == 0) {
    // strings are equal
    ...
} else {
    // strings are NOT equal
}
person NPE    schedule 25.11.2012
comment
К сожалению, я до сих пор не могу войти в состояние. @NPE - person Bryan Wong; 25.11.2012
comment
Заголовок C++ 'string.h' устарел. рассмотрите возможность использования 'cstring' вместо этого - person ET-CS; 16.01.2021

Это условие не будет работать, потому что оператор == не перегружен для char*.

if(stpr==data)
{ 
  isData = true; 
}

Используйте это вместо этого.

if (strcmp(stpr, data) == 0)
{
  isData = true ;
}

strcmp() возвращает 0, если обе cstring равны. Убедитесь, что обе cstring, которые вы сопоставляете, содержат некоторую допустимую память и заканчиваются нулем в конце.

Редактировать:

Чтобы избежать каких-либо хлопот и ошибок, рекомендуется не использовать сырой char*, а вместо этого использовать std::string. Так что лучше сделайте их строками и сравните их.

std::string data ;   //passed or declared as string
std::string stpr ;
.....
//Do some work.

if (stpr == data)
   //do work here

Такой подход убережет вас от многих проблем.

person Coding Mash    schedule 25.11.2012
comment
0 == strcmp выглядит немного более явно, чем !strcmp ИМХО - person Kos; 25.11.2012
comment
Да, ты прав. Старые практики редко исчезают. :) - person Coding Mash; 25.11.2012
comment
Привет @Coding Mash, я все еще не могу ввести условие, даже если 2 символа совпадают. Может ли тип или stm быть связан с этой ошибкой? - person Bryan Wong; 25.11.2012
comment
Обеим cstrings выделена некоторая память и они заканчиваются нулем? - person Coding Mash; 25.11.2012
comment
@CodingMash, вы могли видеть, что я могу вычислить как временные данные, так и данные, прежде чем проводить сравнение - person Bryan Wong; 25.11.2012
comment
Опубликуйте еще код и откуда вызывается функция. Там будет какая-то проблема - person Coding Mash; 25.11.2012
comment
могу ли я на самом деле преобразовать Char* в строку, а затем сравнить строку и строку? - person Bryan Wong; 25.11.2012
comment
@CodingMash, пожалуйста, посоветуйте из отредактированного кода - person Bryan Wong; 25.11.2012

Вы пытаетесь сравнить два символа char*. Вы можете попробовать использовать strcmp(stpr, data) для проверки условий.

Лучше использовать его как

 if(strcmp(stpr, data)==0){..}
person Rahul Tripathi    schedule 25.11.2012