0

最初はCでサンプリングされたプロジェクトに取り組んでいますが、C++で作業したいと考えています。

strcat()が使用されているセクションがありますが、別の方法を使用するように言われています。ここで見つけましたが、それらを試してみると、コンパイラーは次のエラーを出します。

エラー:char*' andchar*'型からバイナリ`operator+'への無効なオペランド

私が間違っていることはありますか?

編集:

これが機能しないコードの部分です

FILE *FileOpen(string *fname, string* mode){
FILE *fp;
string *str = "";

str += "tmp/"; //all files to be created in temporary sub directory
str += fname;
if((fp=fopen(str,mode))==NULL){
fprintf(stderr,"Cannot open file: %s\n", &fname);
exit(1);
}
FileReader(fname);
return(fp);
}

編集2:なぜ私がFileReaderを持っているのか疑問に思っている人のために:それはプロジェクトのパート2のためのものです。コードの逆アセンブル。

4

4 に答える 4

1

コードを投稿していただきありがとうございます。今、問題はすぐに明らかになります。

文字列オブジェクトへのポインタではなく、文字列オブジェクトを使用する必要があります。

FILE *FileOpen(string fname, string mode)
{
    string str = "";

    str += "tmp/"; //all files to be created in temporary sub directory
    str += fname;
    FILE *fp = fopen(str.c_str(), mode.c_str());
    if (!fp) {
        fprintf(stderr, "Cannot open file: %s\n", fname.c_str());
        exit(1);
    }
    FileReader(fname);
    return fp;
}

次の良いステップは、引数を受け入れるI / O関数に移動することです。そのため、どこでもstd::string言う必要はありません。.c_str()

FileReader(fname)また、ファイルを開く機能の中にある理由もわかりません。これは、単一責任原則に2回違反します。ファイルを開いてもファイルが読み取られることはなく、ファイルを読み取るコードではファイルFILE*名を気にせずにを使用する必要があります(エラーメッセージの生成を除く)。

于 2013-02-24T21:45:06.910 に答える
1

コードは表示されていませんが、次のようなものがあったと思われます

char *s1 = "Hello, ", *s2 = "world!";
char buf[50];
strcpy(buf, s1);
strcat(buf, s2);

そして今、あなたはそれを

char *s1 = "Hello, ", *s2 = "world!";
char buf[50];
buf = s1 + s2;

既にお気づきのように、これは機能しません。char ポインターと char 配列std::stringも同様に変更する必要があります

std::string s1 = "Hello, ", s2 = "world!";
std::string buf = s1 + s2;
于 2013-02-24T21:38:04.520 に答える
0

コードがchar *文字列として使用している場合は、strcatおそらくそれが適切な関数です。もちろん、C ++ソリューションはを使用するstd::stringことです。この場合、に使用できる+バイナリがoperator+あるため、-を使用できますstd::string

于 2013-02-24T21:36:01.033 に答える
0

std::stringC++ には、演算子 + が連結を実行する文字列クラスがあります。ただし、最初に作成する必要があります。

そのため、式"abc" + "def"はコンパイルされませんが、正常にstd::string("abc")+"def"動作します。

あるいは、次のように書くこともできます

std::string s("abc");
s += "def";

同様に、

std::string s = "abc";
s += "def";

大量のテキストを連結し、パフォーマンスを気にする場合は、 の使用を検討してstd::ostringstreamください。

于 2013-02-24T21:38:56.073 に答える