当我尝试反转char *时出现意外输出

时间:2014-01-10 11:57:19

标签: c++ string algorithm coding-style reverse

#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);
}

当我尝试运行时,我得到一些疯狂的输出,我的电脑开始发出哔哔声。我在这里公然做错了什么?

4 个答案:

答案 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;
}