1

我正在编写一个非常简单的测试程序来交换 char* 指向的字符串中的所有字符。但是,我从 Visual C++ 中得到了一个非常奇怪的异常。

我的代码将粘贴在下面,Chapter1 是项目的名称。

提前感谢大家,请随时在下面发帖询问任何进一步的问题。

问题2.h

#ifndef _QUESTION2_H_
#define _QUESTION2_H_

namespace Q2
{
    void swap(char *begin, char *end);

    void reverse(char *str);

    void run();
}

#endif

Question2.cpp

#include <iostream>

#include "Question2.h"

using namespace std;

namespace Q2
{
void swap(char *begin, char *end)
{
    char tmp = *begin;
    *begin = *end;
    *end = tmp;
}

void reverse(char *str)
{
    char *begin = str;
    char *end = str;

        while(*end != NULL)
        end++;
    end--;

        for(; begin < end; begin++, end--)
        swap(begin, end);
}

void run()
{
    char *str1 = "hello";

    reverse(str1);

    cout << str1 << endl;

    return;
    }
}

主文件

#include <iostream>

#include "Question2.h"

int main()
{
    Q2::run();

    return 0;
}
4

2 回答 2

1

声明:

char *str1 = "hello";

创建一个指向字符串文字(常量)的指针。您不能写入缓冲区(交换函数试图这样做),否则会导致未定义的行为。如果你真的想使用 C 风格的字符串,那么你可以将它声明为:

char str1[] = "hello";

使用该声明,它会在堆栈上创建存储并将以 null 结尾的字符串复制到该数组中;它仍然是一个以 null 结尾的字符串。

从正确性的角度来看另一件事:找到字符串结尾的循环应该比较'\0'而不是 NULL:

    while(*end != '\0')
于 2013-09-05T22:33:15.853 回答
0

它更容易、更安全、更易读std::string

#include <string>

void swap(std::string& str, int index1, int index2) {

    char temp = str[index1];
    str[index1] = str[index2];
    str[index2] = temp;

}

void reverse(std::string& str) {

    for (int i = 0; i < str.size() / 2; i++)
        swap(str, i, str.size() - i - 1);

}
于 2013-09-05T22:30:40.077 回答