3

我不得不承认,我不知道如何使用指针,但我尝试了很多。我的程序的问题是它反向显示字符串,除了第一个字母丢失并且整个字符串向前移动一个空格,第一个元素为空白。例如,它在输入“hello”时显示“olle”。

#include <iostream>
#include <string>

using namespace std;

string reverse(string word);

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

string reverse(string word)
{
    char *front;
    char *rear;
    for (int i=0;i< (word.length()/2);i++)
    {
            front[0]=word[i];
            rear[0]=word[word.length()-i];
            word[i]=*rear;
            word[word.length()-i]=*front;
    }
    return word;
}

新代码完美运行。将字符串更改为 cstrings。技术上要求cstrings的问题,但我发现字符串更容易,所以我使用字符串然后进行必要的更改以使其成为c字符串。想出 ho 来初始化后部和前部。

#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[0]=word[i];
            rear[0]=word[strlen(word)-1-i];
            word[i]=*rear;
            word[strlen(word)-1-i]=*front;
    }
    return word;
}
4

4 回答 4

5
char *front;
char *rear;

然后稍后

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

然而,问题是,在 C++ 中,使用原始指针很少有充分的理由。改用怎么样std::reverse()

string s = "foobar";
std::reverse(s.begin(), s.end());
于 2013-06-23T06:15:25.937 回答
1
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;
}
于 2014-01-14T03:54:52.640 回答
0

你也可以这样做:

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

它在我的系统上成功运行,即在Windows 7上的emacs+gcc

于 2013-06-20T05:10:18.510 回答
-1

摘自 C How To Program Deitel & Deitel 第 8 版:

void reverse(const char * const sPtr)
{
    if (sPtr[0] == '\0')
        return;
    else
        reverse(&sPtr[1]);
        putchar(sPtr[0]);
}
于 2020-09-03T17:16:47.337 回答