0

文字列を逆にするためにこのコードを書きました。うまくいきますが、「アメリカンビューティー」のような短い文字列を入力すると、実際には「ytuaebnacirema2」と表示されます。これは私のコードです。文字列の最後にランダムな2を出力するコードの何が問題になっているのか知りたいのですが。ありがとう

// This program prompts the user to enter a string and displays it backwards.

#include <iostream>
#include <cstdlib>
using namespace std;

void printBackwards(char *strPtr); // Function prototype

int main() {
    const int SIZE = 50;
    char userString[SIZE];
    char *strPtr;
    cout << "Please enter a string (up to 49 characters)";
    cin.getline(userString, SIZE);
    printBackwards(userString);

}

//**************************************************************
// Definition of printBackwards. This function receives a      *
// pointer to character and inverts the order of the characters*
// within it.                                                  *
//**************************************************************

void printBackwards(char *strPtr) {
    const int SIZE = 50;
    int length = 0;
    char stringInverted[SIZE];
    int count = 0;
    char *strPtr1 = 0;
    int stringSize;
    int i = 0;
    int sum = 0;

    while (*strPtr != '\0') {
        strPtr++; // Set the pointer at the end of the string.
        sum++; // Add to sum.
    }
    strPtr--;

    // Save the contents of strPtr on stringInverted on inverted order
    while (count < sum) {
        stringInverted[count] = *strPtr;
        strPtr--;
        count++;
    }
    // Add '\0' at the end of stringSize
    stringInverted[count] == '\0';

    cout << stringInverted << endl;
}

ありがとう。

4

3 に答える 3

4

ヌル終了が間違っています。==の代わりに使用しています=。変更する必要があります:

stringInverted[count] == '\0';

の中へ

stringInverted[count] = '\0';
于 2012-09-26T04:56:29.753 に答える
1
// Add '\0' at the end of stringSize
stringInverted[count] == '\0';

ここを使うべき=です。

于 2012-09-26T04:59:10.213 に答える
1

コードの問題点は、文字列の長さをカウントするために strlen を使用することさえせず、固定サイズの文字列 (malloc を使用しない、または、gasp new[])、または std::string (これは C++ です) を使用することです。 ! 単純な C でも、strlen を使用しないことは常に間違っています。これは、プロセッサ用に手作業で最適化されているためです。最悪なのは、返される文字列 (stringInverted) をスタック フレームから割り当てたということです。つまり、関数が終了するとポインタが無効になり、コードが「機能する」ときはいつでも純粋に偶然です。

C++ で文字列を反転するには、次のようにします。

#include <iostream>
#include <string>

int main() {
    std::string s = "asdfasdf";
    std::string reversed (s.rbegin(), s.rend());
    std::cout << reversed << std::endl;
}

C99 で文字列を反転するには、次のようにします。

char *reverse(const char *string) {
    int length = strlen(string);
    char *rv = (char*)malloc(length + 1);
    char *end = rv + length;
    *end-- = 0;
    for ( ; end >= rv; end --, string ++) {
        *end = *string;
    }
    return rv;
}

使用後に返されたポインタを解放することを忘れないでください。これまでの他のすべての答えは明らかに間違っています:)

于 2012-09-26T05:04:02.183 に答える