6

可能重复:
为什么在写入字符串时会出现分段错误?

我想编写一个简单的 C++ 函数,它仅通过指针算术来反转 string/ char[]。我理解这个概念并且已经输入了代码。

我有以下 .cpp 文件:

#include <iostream>
using std::cout;
using std::endl;

void reverse(char* target) //Requirements specify to have this argument
{
    cout << "Before :" << target << endl; // Print out the word to be reversed
    if(strlen(target) > 1) // Check incase no word or 1 letter word is placed
    {
        char* firstChar = &target[0]; // First Char of char array
        char* lastChar = &target[strlen(target) - 1]; //Last Char of char array
        char temp; // Temp char to swap
        while(firstChar < lastChar) // File the first char position is below the last char position
        {
            temp = *firstChar; // Temp gets the firstChar
            *firstChar = *lastChar; // firstChar now gets lastChar
            *lastChar = temp; // lastChar now gets temp (firstChar)
            firstChar++; // Move position of firstChar up one
            lastChar--; // Move position of lastChar down one and repeat loop
        }
    }
    cout << "After :" << target << endl; // Print out end result.
}

void main()
{
    reverse("Test"); //Expect output to be 'tseT'
}

我已经多次进入调试器,但每次它都会temp = *firstChar在 while 循环中崩溃。它在这里冻结并导致程序停止运行并且无法完成。有什么我只是忽略了,或者有什么更深层次的东西为什么我不能这样做。

编辑:有一个 else 条件,但为了简洁起见,我将其删除。它是在if声明之后,它只是提示这个词是 1 个字符或没有输入任何词。

4

2 回答 2

8

问题不在于reverse函数,而在于调用代码。

reverse("Test");

字符串文字是只读的,试图修改一个会导致未定义的行为。注意编译器警告(如果没有得到任何警告,请调高警告级别)。上面的行应该生成有关从不推荐的转换const char *char *正在执行的警告。

要修复代码:

int main() // <-- note the return type, int NOT void!
{
  char str[] = "Test";
  reverse( str );
}
于 2012-10-22T00:10:08.353 回答
0

此代码将反转它两次。将循环除以二。

于 2012-10-22T01:16:46.787 回答