1

これを解決しようとして4時間かかりましたが、できません。私はこの機能を持っています:

  string getRuta(int i, char* buffer, string directorio) {
    int j = 0;
    string nom;
    char s;
    do {
            s = (char) buffer[i];
            nom[j] = s;
            j++;
            i++;
    } while (buffer[i] != 13);
    nom[j] = '\0';
    char *cstr = new char();
    strcpy(cstr, directorio.c_str());
    strcat(cstr, nom.c_str());
    printf("%s\n",cstr);
    string ruta = cstr;
    printf("%s\n",ruta.c_str());
    return ruta; }

理由はわかりませんが、最初の印刷では期待どおりの出力が得られますが、2番目の印刷では奇妙なものが印刷されます。関数の入力と結果を出力します。

buffer = "share feo" directorio = "/home/demian/archredes/" 最初の出力: /home/demian/archredes/feo 2 番目の出力: /home/demian/archredes/fA

ありがとうございます!

4

5 に答える 5

2

variable の文字列全体に 1 バイトのメモリを割り当てているようですcstr。試す:

char *cstr = new char [directorio.size() + nom.size() + 1];
于 2013-09-19T15:22:00.383 に答える
2

std::stringaの文字をその末尾 (両方のnom[j] =行) を超えて変更することにより、未定義の動作を呼び出しています。代わりにメンバー関数を使用し、バッファーpush_backを使用する代わりに文字列を直接連結する必要があります。char

さらに、1文字だけを割り当ててから、それをstrcpy過ぎて...そしてそのポインタをリークします。

また、文字定数の代わりにマジック ナンバーを使用します\r

これは修正された(そしてはるかに単純な)バージョンです:

string getRuta(int i, char const* buffer, string directorio) {
    string nom;
    char c;
    do {
        c = buffer[i];
        nom.push_back(c);
        i++;
    } while (buffer[i] != '\r');

    string ruta = directorio + nom;
    printf("%s\n",ruta.c_str());
    return ruta;
}
于 2013-09-19T15:22:56.690 に答える
1

このように C と C++ を混在させるのは賢明なことではありません。C++ コードを作成している場合は、C スタイルのコードをできるだけ避けてください。このコードでは:

char *cstr = new char();
strcpy(cstr, directorio.c_str());
strcat(cstr, nom.c_str());

cstr1 へのポインタcharです。あなたがおそらく意味したのは、配列を割り当てることでした:

char *cstr = new char[directorio.size() + nom.size() - 1];

まだstd::stringオブジェクトを扱っているので、実際にすべきことは次のとおりです。

std::string ruta = directorio + nom;
于 2013-09-19T15:22:59.313 に答える
0

コードが多すぎて、C/C++ 文字列の不適切な組み合わせです。

短いバージョン:

// Precondition: i is a valid index into the buffer.
// Use a const char* (please)
// Use std::size_t (maybe)
string getRuta(std::size_t i, const char* buffer, string directorio) {
    std::size_t k = i;
    // Test for end of string and '\r' == 13
    while(buffer[k] && buffer[k] != '\r') ++k;
    // Append the whole range once, to reduce the number of 
    // possible reallocations:
    return directorio.append(buffer + i, k - i);
}

int main()
{
    const char* buffer = " World\r\n Planet";
    std::cout << getRuta(0, buffer, "Hello") << std::endl;
    return 0;
}
于 2013-09-19T15:37:12.790 に答える
0

単一の文字ではなく、文字の完全な配列を割り当てる必要があります。そのままでは、1文字を割り当ててからそのスペースに大幅に多くのデータをコピーするため、strcpyでメモリを破損しています。

于 2013-09-19T15:24:30.380 に答える