#include<iostream>
#include<string>
using namespace std;
void reverse(char* str)
{
char *new_str = str;
while(*new_str != '\n'){
new_str++;
}
while(new_str != str){
cout << *new_str;
new_str--;
}
cout << *new_str;
}
int main()
{
char *str = new char[1024];
str = "hello world";
reverse(str);
}
当我尝试运行时,我得到一些疯狂的输出,我的电脑开始发出哔哔声。我在这里公然做错了什么?
答案 0 :(得分:4)
C字符串的结尾由字符'\0'
标记。您使用'\n'
newline character。
答案 1 :(得分:2)
你的意思是除了使用裸漏new
,弃用的char*
而不是const char*
或更好std::string
,而不是使用标准库算法{{1} },将IO与您的算法混合并包括整个std::reverse
(可能间接地将namespace std
纳入范围)而不将自己的std::reverse()
放在其自己的命名空间中?
reverse()
如果您只对如何对反向算法进行编码感兴趣,那么one way to do it不依赖于您有一个空终止符的事实:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
// using namespace std; // for the brave, and drop the std:: in the next 3 lines
int main()
{
std::string str = "hello world"; // std::string instead of char*
std::reverse(begin(str), end(str)); // standard library algorithm
std::cout << str; // IO separate from algorithm
}
答案 2 :(得分:0)
问题是,首先你为str分配了内存的地址,然后重新分配它,指向C ++中类型为const char []的字符串文字。
char *str = new char[1024];
str = "hello world";
此字符串文字已终止零字符'\ 0'。它没有新行char'\ n'。因此该函数无效,因为它将尝试访问搜索新行char的数组之外的内存。
有效代码可以采用以下方式
#include <iostream>
using namespace std;
void reverse( const char* s )
{
const char *p = s;
while ( *p ) p++;
while ( p != s ) cout << *--p;
}
int main()
{
const char *s = "hello world";
reverse( s );
}
或者,如果您想以交互方式自己输入字符串,那么main可能看起来像
int main()
{
const size_t N = 1024;
char s[N];
cout << "Enter a statement: ";
cin.getline( s, N );
reverse( s );
}
答案 3 :(得分:0)
纠正你的功能:
void reverse(char* str)
{
char *new_str = str;
while(*new_str){ // use this instead of *new_ptr != '\n'
new_str++;
}
while(new_str != str){
cout << *new_str;
new_str--;
}
cout << *new_str;
}