0

これは私を困惑させてきました、単純なコード:

int main()
{
    typedef std::string::size_type stype;
    std::cout << "What is your first name?\n";
    std::string first,second,fullname;
    std::cin >> first;
    std::cout << "What is your second name?\n";
    std::cin >> second;
    char * backwards;
    fullname = first + " " + second;
    stype fnsize = fullname.size();    
    backwards = new char [fnsize];
    stype b = 0;
    for(stype a = fnsize; a != 0; --a)
    {
       backwards[b++] = fullname[a - 1];
    }
    std::cout << backwards << std::endl;
    return 0;
}

ほとんどの場合は機能しますが、自分の名前であるstanislaw terzievを作成すると、veizretwalsinatsではなく出力veizretwalsinatsslawが返されます。

なんでそうなの?

4

3 に答える 3

6

ヌルターミネータを忘れたと思います'\0'。次のことを行う必要があります。

backwards = new char [fnsize+1];
backward[fnsize] = '\0';
于 2013-01-13T23:45:15.950 に答える
2

コードに2つの問題があります。

まず、文字列の終了を許可する必要があります(Cスタイルの文字列に必要であり、メソッドの戻り値には含まれませんbackwards)。 fnsize + 1std::string::size()

backwards次に、文字の最後の要素'\0'(文字列の終わりの文字)を作成します。これstd::coutがないと、char *'がどこで終わるかわからないため、ガベージ文字が表示されることがあります。つまり、std :: coutは、に達するまで文字を出力し続け'\0'ます。

あなたが同様に見ることができる他のいくつかのオプション:

  1. 後方に作成しstd::stringて使用するappend(fullname[a-1])
  2. 使用するstd::reverse
于 2013-01-13T23:54:22.200 に答える
1

自分でメモリを管理する(またはnulターミネータを気にする)ことなく、これをはるかにクリーンに行うことができます。

#include <string>
#include <iostream>

int main()
{
    std::cout << "What is your first name?\n";
    std::string first, second;
    std::cin >> first;
    std::cout << "What is your second name?\n";
    std::cin >> second;
    std::string fullname(first + " " + second);
    std::string backwards(fullname.rbegin(), fullname.rend()); // use reverse iterator
    std::cout << backwards << std::endl;
    return 0;
}
于 2013-01-13T23:51:26.547 に答える