15

重複の可能性:
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;

tempandが一致しても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();
    }

}
4

3 に答える 3

24

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

#include <string.h>
...
if (strcmp(stpr, data) == 0) {
    // strings are equal
    ...
} else {
    // strings are NOT equal
}
于 2012-11-25T07:58:37.510 に答える
5

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

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

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

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

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

編集:

あらゆる種類の面倒やバグを回避するために、 rawchar*を使用せず、std::string代わりに使用することをお勧めします。したがって、それらを文字列にして比較することをお勧めします。

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

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

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

于 2012-11-25T07:59:20.083 に答える
2

2 つの char* を比較しようとしています。strcmp(stpr, data)条件の確認に使ってみてください。

のように使用する方が良い

 if(strcmp(stpr, data)==0){..}
于 2012-11-25T08:00:06.493 に答える