use*_*395 3 c++ string reverse pointers
我不得不承认,我不知道如何使用指针,但我仍然尝试过。我的程序的问题是,它反向显示字符串,除了第一个字母丢失,整个字符串向前移动一个空格,第一个元素为空白。例如,当输入“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;
}
Run Code Online (Sandbox Code Playgroud)
新代码完美运行。将字符串更改为 cstrings。从技术上来说,问题是针对 cstrings 的,但我发现字符串更容易,所以我使用字符串,然后进行必要的更改以使其成为 c 字符串。想出如何初始化后部和前部。
#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;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
char *front;
char *rear;
Run Code Online (Sandbox Code Playgroud)
然后稍后
front[0]=word[i];
rear[0]=word[strlen(word)-1-i];
Run Code Online (Sandbox Code Playgroud)
不好。取消引用未初始化的指针会调用未定义的行为。
除此之外,您的代码过于复杂,它strlen()在每次迭代(甚至多次)期间调用,这是多余的,并且交换逻辑也不必要地复杂。尝试使用两个指针,你的代码会更干净:
void rev_string(char *str)
{
char *p = str, *s = str + strlen(str) - 1;
while (p < s) {
char tmp = *p;
*p++ = *s;
*s-- = tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,事实是,在 C++ 中很少有充分的理由使用原始指针。改用怎么样std::reverse()?
string s = "foobar";
std::reverse(s.begin(), s.end());
Run Code Online (Sandbox Code Playgroud)