web-dev-qa-db-ja.com

等しいかどうかの2つのchar *の比較

可能性のある複製:
2つの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;
_

tempdataが一致しても、次の条件は機能しません。

_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();
    }

}
_
11
Bryan Wong

stprdataはどちらもC文字列なので、 strcmp() を使用する必要があります。

#include <string.h>
...
if (strcmp(stpr, data) == 0) {
    // strings are equal
    ...
} else {
    // strings are NOT equal
}
19
NPE

_==_演算子は_char*_に対してオーバーロードされないため、この条件は機能しません。

_if(stpr==data)
{ 
  isData = true; 
}
_

代わりにこれを使用してください。

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

strcmp() は、両方のcstringが等しい場合に_0_を返します。一致する両方のcstringが正当なメモリを保持し、最後にnullで終了していることを確認してください。

編集:

なんらかの面倒やバグを回避するために、生の_char*_を使用せず、代わりに_std::string_を使用することをお勧めします。そのため、それらを文字列にして比較します。

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

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

このアプローチにより、多くのトラブルを回避できます。

5
Coding Mash

2つのchar *を比較しようとしています。状況を確認するためにstrcmp(stpr, data)を使用してみることができます。

次のように使用する

 if(strcmp(stpr, data)==0){..}
2
Rahul Tripathi