C++ 使用指针反转字符串

C++ 使用指针反转字符串,c++,string,pointers,reverse,C++,String,Pointers,Reverse,我必须承认,我不知道如何使用指针,但我尝试的次数更少。我的程序的问题是,它以相反的方式显示字符串,除了缺少第一个字母外,整个字符串向前移动了一个空格,第一个元素为空。 例如,当输入“hello”时,它会显示“olle” #包括 #包括 使用名称空间std; 字符串反转(字符串字); int main() { char-Cstring[50]; coutstring; 字符串结果=反向(Cstring); cout你也可以这样做: #include <iostream> #includ

我必须承认,我不知道如何使用指针,但我尝试的次数更少。我的程序的问题是,它以相反的方式显示字符串,除了缺少第一个字母外,整个字符串向前移动了一个空格,第一个元素为空。 例如,当输入“hello”时,它会显示“olle”

#包括
#包括
使用名称空间std;
字符串反转(字符串字);
int main()
{
char-Cstring[50];
coutstring;
字符串结果=反向(Cstring);

cout你也可以这样做:

#include <iostream>
#include <cstring>

using namespace std;

string reverse(char word[20]);

int main()
{
char Cstring[20];
cout<<"enter a word: ";
cin>>Cstring;
string results = reverse(Cstring);
cout <<results;
}

string reverse(char word[20])
{
    char a='a';
    char b='b';
    char *front=&a; 
    char *rear=&b;
    for (int i=0;i< (strlen(word)/2);i++)
    {
            *front=word[i];
            *rear=word[strlen(word)-1-i];
            word[i]=*rear;
            word[strlen(word)-1-i]=*front;
    }
    return word;
}
#包括
#包括
使用名称空间std;
字符串反转(字符字[20]);
int main()
{
char-Cstring[20];
coutstring;
字符串结果=反向(Cstring);
库特
后来

front[0]=word[i];
rear[0]=word[strlen(word)-1-i];
不好。取消引用未初始化的指针会调用未定义的行为

除此之外,您的代码过于复杂,它在每次迭代(甚至多次)期间调用
strlen()
,这是多余的,交换逻辑也不必要地复杂。尝试使用两个指针,您的代码将更加干净:

void rev_string(char *str)
{
    char *p = str, *s = str + strlen(str) - 1;
    while (p < s) {
        char tmp = *p;
        *p++ = *s;
        *s-- = tmp;
    }
}
内联无效交换(char*a,char*b)
{
char tmp=*a;
*a=*b;
*b=tmp;
}
内联无效反向_字符串(char*pstart,char*pend)
{
同时(pstart标准::cout摘自C如何编程Deitel&Deitel第8版:

void reverse(const char * const sPtr)
{
    if (sPtr[0] == '\0')
        return;
    else
        reverse(&sPtr[1]);
        putchar(sPtr[0]);
}

我有一种感觉,你的代码完全是靠运气工作的。你正在使用(取消引用)两个你还没有初始化的
char
指针,
front
rear
。你没有为
front
rear
分配内存,所以你在使用
front[0]
rear[0]时调用了未定义的行为
。除此之外,单词的最后一个索引是
word[word.length()-1]
,您应该使用
word[word.length()-1-i]
。所以我应该将它们初始化为什么,任何旧字符或特定的东西,正如我所说的,我对指针非常陌生。“我不知道如何使用指针。”-很好,这个星球需要更少的指针和更理智的、人类可读的代码。请通过拒绝学习来帮助世界消除指针。好的。我明白了,我想。所以基本上我在尝试访问word中不存在的元素。据我从编辑记录中看到的,用户2420395创建了他的答案(在对问题的编辑中)2013-06-19 20:57;你在2013-06-20 05:10创建了答案,大约8小时后。他写的东西和你写的东西之间唯一的区别是
front[0]
vs
*front
reast[0]
vs
*rear
。这不会改变代码的功能;只是术语不同。因此,我不知道你为什么会认为它值得称赞。它甚至不是一个很好的算法。
strlen()有太多的用途
明智。使用C指针的最佳解决方案要简单得多。这意味着我当时可能没有看到编辑,或者我没有注意到编辑,正如您所看到的,当时有一些重要的问题,OP当时没有初始化前后变量,正如您所看到的,我是唯一的答案,所以我想接受它不会有任何坏处,但现在有了其他“更好”的答案,我不希望有任何信用。这里的新用户渴望“声誉”,这不会被削弱这就是我的原因。如果你觉得我的答案不是很好,你可以投票否决它!对正确的短C型代码来说是的。未初始化的
在问题的第二版中得到了修复,但那是…有趣的代码,我们可以说。还有
strlen()的滥用
也很明显。@JonathanLeffler谢谢。是的,我甚至不想提及不可读的无空格编码风格,这并不是严格意义上的技术错误,但仍然使代码看起来非常不专业。1.当两边都有匹配的字符时,这不起作用,例如“acba”给出“a”2。如果函数没有用指针或值返回任何东西,那就不是很有用。3是问题。C++是最好的。最好用C++来回答这个问题。@我已经编辑了我的答案。(对其他C++代码)如果它通过引用、指针等返回某物,注意OP的代码>反转< /code >函数返回<代码>字符串
front[0]=word[i];
rear[0]=word[strlen(word)-1-i];
void rev_string(char *str)
{
    char *p = str, *s = str + strlen(str) - 1;
    while (p < s) {
        char tmp = *p;
        *p++ = *s;
        *s-- = tmp;
    }
}
string s = "foobar";
std::reverse(s.begin(), s.end());
inline void swap(char* a, char* b)
{
    char tmp = *a;
    *a = *b;
    *b = tmp;
}

inline void reverse_string(char* pstart, char* pend)
{
    while(pstart < pend)
    {
        swap(pstart++, pend--);
    }

}

int main()
{
    char pstring[] = "asfasd Lucy Beverman";
    auto pstart = std::begin(pstring);
    auto pend = std::end(pstring);
    pend -= 2; // end points 1 past the null character, so have to go back 2
    std::cout << pstring << std::endl;        
    reverse_string(pstart, pend);
    std::cout << pstring << std::endl;
    return 0;
}
void reverse(const char * const sPtr)
{
    if (sPtr[0] == '\0')
        return;
    else
        reverse(&sPtr[1]);
        putchar(sPtr[0]);
}