我正在编写一个非常简单的测试程序来交换char *指向的字符串中的所有字符。但是,我从Visual C ++中得到了一个非常奇怪的例外。
我的代码将粘贴在下面,第1章是项目的名称。
提前感谢所有人,请随时在下面发帖以询问任何进一步的问题。
Question2.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;
}
}
的main.cpp
#include <iostream>
#include "Question2.h"
int main()
{
Q2::run();
return 0;
}
答案 0 :(得分:1)
宣言:
char *str1 = "hello";
创建一个指向字符串文字的指针(常量)。您无法写入缓冲区(交换函数尝试执行此操作),否则会导致未定义的行为。如果您真的想要使用C样式字符串,那么您可以将其声明为:
char str1[] = "hello";
使用该声明,它在堆栈上创建存储并将空终止的字符串复制到该数组中;它仍然是以空字符结尾的字符串。
从正确性的角度来看另一件事:找到字符串结尾的循环应该与'\0'
进行比较而不是NULL:
while(*end != '\0')
答案 1 :(得分: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);
}