0

我写了这段代码来反转字符串。它工作得很好,但是当我输入像“american beauty”这样的短字符串时,它实际上会打印“ytuaeb nacirema2”。这是我的代码。我想知道在字符串末尾打印随机 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 回答