字符串倒置

susuding 2011-02-24 01:24:59
[要求:编写函数,实现将“i am from hunan”倒置为“hunan from am i”;
想用指针数组实现,首先将指针数组指向字符串的首位置;
然后向后遍历字符串如果遇到空格,则将指针数组的下一个元素指向空格后的单词,并统计空格数;
最后根据统计的空格个数,将指针数组所存放的内容倒叙输出。
思路是否正确,具体该怎样实现呢,请指教?
...全文
415 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zhhmily 2011-02-25
  • 打赏
  • 举报
回复
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

int main()
{
char str1[256] = "i am from hunan";
char str2[256] = "";
char *pDest = strrchr(str1, ' ');
while (pDest)
{
sprintf(str2, "%s%s ",str2, pDest+1); *pDest = '\0';
pDest = strrchr(str1, ' ');
}
sprintf(str2, "%s%s", str2, str1);
printf("%s\n", str2);
}
lovelyzxg 2011-02-25
  • 打赏
  • 举报
回复
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <functional>

using namespace std;


void main()
{
const int VECTOR_SIZE = 8 ;

// Define a template class vector of strings
typedef vector<string > StrVector ;

//Define an iterator for template class vector of strings
typedef StrVector::iterator StrVectorIt ;

StrVector Tongue_Twister(VECTOR_SIZE) ;

StrVectorIt start, end, it ;

start = Tongue_Twister.begin() ; // location of first
// element of Tongue_Twister

end = Tongue_Twister.end() ; // one past the location last
// element of Tongue_Twister

//Initialize vector Tongue_Twister
Tongue_Twister[0] = "she" ;
Tongue_Twister[1] = "sells" ;
Tongue_Twister[2] = "sea" ;
Tongue_Twister[3] = "shells" ;
Tongue_Twister[4] = "by";
Tongue_Twister[5] = "the";
Tongue_Twister[6] = "sea" ;
Tongue_Twister[7] = "shore" ;

cout << "Before calling reverse \n" << endl ;

// print content of Tongue_Twister
cout << "Try this Tongue Twister: " ;
for(it = start; it != end; it++)
cout << *it << " " ;
cout << "\n\n" ;

// reverse the items in the vector Tongue_Twister
reverse(start, end) ;

cout << "After calling reverse \n" << endl ;

// print content of Tongue_Twister
cout << "Now try the reversed Tongue Twister: " ;
for(it = start; it != end; it++)
cout << *it << " " ;
cout << "\n\n" ;

}
csdn里面的程序~
acdbxzyw 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiaoboalex 的回复:]

既然都用C++了,那就用STL吧,四行代码搞定:

[/Quote]
杀鸡焉用牛刀?
#include<iostream>
#include <algorithm>
using namespace std;

int main(void)
{
char p[] = "let's go";
reverse(p,p+strlen(p));
return 0;
}
heguodong 2011-02-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xiaoboalex 的回复:]
既然都用C++了,那就用STL吧,四行代码搞定:

C/C++ code
#include <iostream>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;

int main()
{
vector<string>……
[/Quote]
赞同,学C++的都多熟悉下STL吧
xiaoboalex 2011-02-25
  • 打赏
  • 举报
回复
既然都用C++了,那就用STL吧,四行代码搞定:
#include <iostream>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;

int main()
{
vector<string> svec;
copy(istream_iterator<string>(istringstream (string("i am from hunan"))), istream_iterator<string>(), back_inserter(svec));
reverse(svec.begin(), svec.end());
copy(svec.begin(), svec.end(), ostream_iterator<string>(cout, " "));

system("pause");
}
rwjlqn 2011-02-25
  • 打赏
  • 举报
回复
只要有了思路 剩下的就是去实践了~
pstrunner 2011-02-25
  • 打赏
  • 举报
回复
理解好题意再说:(

[Quote=引用 15 楼 fyzqzpd 的回复:]

C/C++ code
//来个更简单的
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
char p[]= "I am from shandong";
for (int i =0,b = 1; i < strlen(p)/2; i++,b++)
{
……
[/Quote]
pstrunner 2011-02-25
  • 打赏
  • 举报
回复

typedef char *pchar;

void print_word(char *str)
{
while (*str!=' ' && *str!='\0')
{
cout << *str;
str++;
}
}

void pointer_array(char *str)
{
char *pos = str;
pchar *pch = new pchar[strlen(str)];

*pch = pos;
pch++;
while ('\0' != *pos)
{
if (' ' == *pos++)
{
*pch = pos;
pch++;
}
}

pch--;
while (1)
{
print_word(*pch);
cout << " ";
if (*pch == str)
{
break;
}
pch--;
}
delete []pch;
}
int main(int argc, char **argv)
{
char chStr[100] = "i am from hunan";
pointer_array(chStr);
}

[Quote=引用 8 楼 susuding 的回复:]

感谢六楼和七楼,你们的方法都很对,但是纠结于指针数组的使用,能不能用指针数组的方法实现呢
[/Quote]
zhao1zhong6 2011-02-25
  • 打赏
  • 举报
回复
//来个更简单的
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
char p[]= "I am from shandong";
for (int i =0,b = 1; i < strlen(p)/2; i++,b++)
{
char c = *(p+i);
*(p+i) = *(p+ strlen(p)-b);
*(p+ strlen(p)-b) = c;
}
cout<< p;
system("pause");
return 0;
}
susuding 2011-02-24
  • 打赏
  • 举报
回复
感谢六楼和七楼,你们的方法都很对,但是纠结于指针数组的使用,能不能用指针数组的方法实现呢
xjz19901211 2011-02-24
  • 打赏
  • 举报
回复

string str = "i am from hunan";

for (int i = 0; i < str.length()/2; i++) //所有逆序
{
char temp = str[i];
str[i] = str[str.length() - i - 1];
str[str.length() - 1 - i] = temp;
}

for (int i = 0; i < str.length(); i++)
{
int j = i;
while (str[j] != ' '&& str[j] != '\0') j++;//单词尾

j -= 1;

for (int k = i; k <= (j + i)/2; k++) //单词再逆序
{
char temp = str[k];
str[k] = str[j - (k - i)];
str[j - (k - i)] = temp;
}
i = j + 1;//下一个单词
}


差不多就这样吧……
pstrunner 2011-02-24
  • 打赏
  • 举报
回复

void invert_word(char *pstart, char *pend)
{
int len = pend - pstart;
for (int i=0; i<len/2; i++)
{
std::swap(*pstart, *(pend-1));
pstart ++;
pend --;
}
}

void invert_string(char *pch)
{
invert_word(pch, pch+strlen(pch));
char *pre = pch, *post = NULL;
while (NULL != (post = ::strchr(pre, ' ')))
{
invert_word(pre, post);
pre = post + 1;
}
}

int main(int argc, char **argv)
{
char chStr[100] = "i am from hunan";
invert_string(chStr);
}


[Quote=引用 5 楼 ptrunner 的回复:]

3,4楼只是将整行进行倒置,没有把具体单词进行倒置。

应该还有一步,就是依据空格分隔单词,将每个单词倒置一下就可以啦;

具体算法与3,4楼雷同。
[/Quote]
pstrunner 2011-02-24
  • 打赏
  • 举报
回复
3,4楼只是将整行进行倒置,没有把具体单词进行倒置。

应该还有一步,就是依据空格分隔单词,将每个单词倒置一下就可以啦;

具体算法与3,4楼雷同。
justkk 2011-02-24
  • 打赏
  • 举报
回复
void revs(char *s)
{
char *p1, *p2, c;

if( s == NULL || *s == 0 ) return;

p1 = s;
p2 = s + strlen(s);

while( --p2 > p1 )
{
c = *p1;
*p1 = *p2;
*p2 = c;
p1++;
}
}
bdmh 2011-02-24
  • 打赏
  • 举报
回复

char* p = "i am from hunan";
int len = strlen(p);
for (int i= len-1;i>=0;i--)
{
printf("%c",*(p+i));
}
zx0319 2011-02-24
  • 打赏
  • 举报
回复
读到一个空格断开,独立cpy到一个字符串中,之后逆序连接就好了。
wei801516 2011-02-24
  • 打赏
  • 举报
回复
放入vector里面 用vector的反串机制 就哦了!~~安全

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧