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