怎样倒置字符串I am you为you am I

leejohn 2007-05-23 09:21:17
怎样倒置字符串I am you为you am I
写了很久无法解决,只好了请教了?
...全文
2073 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwpzwp123 2011-09-04
  • 打赏
  • 举报
回复
在C++中用的是string,而上面简单的就是用的char数组,完全是两回事,仅仅用数组和循环实现可以不是很多笔试题目的初衷吧...
ammana_babi 2007-07-20
  • 打赏
  • 举报
回复
呵呵实在不好意思,前面把题看错了,以为就是简单的翻转字符串呢。
下面给出答案,包含完整的代码。
PS:下面程序的代码在DEV C++ 4.9.9.2 下编译通过
你也可以参考我的blog上面的文章:
http://blog.chinaunix.net/u/25381/showart_343476.html

http://blog.csdn.net/ammana_babi/archive/2007/07/20/1700261.aspx

在不增加任何辅助数组空间的情况下,对于这个问题我们可以采用的办法就是:
办法一:
1、 翻转整个字符串。
2、 翻转每一个单词。
办法二:
1、 翻转每一个单词。
2、 翻转整个字符串。
办法一和二其实就是一个顺序的问题,并不影响算法的时间或空间复杂度。

下面给出代码:【本程序在DEV C++ 4.9.9.2 下编译通过】
#include <stdio.h>

#define IS_PRINT(ch) ( (ch) > 0x20 && (ch) < 0x7E )
// except cpace

char * ReverseEveryWord(char *str);
char * ReverseWholeString(char * str);
char * LR_Reverse(char *left,char *right);

int main(void)
{
char str[] = "Hello word! **";
char *p = str;

#if 0
ReverseWholeString(str);
ReverseEveryWord(str);
puts(str);
#else
ReverseEveryWord(str);
ReverseWholeString(str);
puts(str);
#endif

system("pause");
return 0;
}
char * ReverseEveryWord(char *str)
{
char *right = str,*left = str;

if(str == NULL)
return NULL;

while( !IS_PRINT(*right) )
right++;
while(*right)
{
left = right;
while(IS_PRINT(*right))
right++;
LR_Reverse(left,right-1);
while(*right && !IS_PRINT(*right))
right++;
}
return str;
}
char * ReverseWholeString(char * str)
{
char *p = str;

if(str == NULL)
return NULL;

while(*p) p++;
p--;

LR_Reverse(str,p);

return str;
}
char * LR_Reverse(char *left,char *right)
{
char tt,*ret = left;

if(left == NULL || right == NULL)
return NULL;

while(left < right)
{
tt = *left;
*left++ = *right;
*right-- = tt;
}
return ret;
}
haohuilai 2007-06-15
  • 打赏
  • 举报
回复
mark
zhongbx 2007-06-12
  • 打赏
  • 举报
回复
String str = "I an you";
String []s = str.split(" ");
然后倒着输出 s[] 就 Ok 了
zhongbx 2007-06-12
  • 打赏
  • 举报
回复
用 split()两下就出来了,何必呢,不过不知道c /c++ 中有没有这个哦
heixia108 2007-06-10
  • 打赏
  • 举报
回复
mark
piziq 2007-06-03
  • 打赏
  • 举报
回复
#include<iostream.h>
#include<string.h>
void reverse(char*str,int n)
{
if (n<=1)
return;
//交换str[]和str[n-1]
char temp=str[n-1];
str[n-1]=str[0];
str[0]=temp;
reverse(str+1,n-2);
}//实现交换字符
void main()
{
char str[100];
cout<<"please input a string";
cin.get(str,100);
reverse(str,strlen(str));

cout<<"after reverse,str="<<str<<endl;
canybox 2007-06-03
  • 打赏
  • 举报
回复
有N种算法.

基本思想可以这样:
1.分离字符串.
2.逆序输出.
hxrs2008 2007-06-01
  • 打赏
  • 举报
回复
好像在我的VC 6.0上连结出了错误~



main()
{ char a[]="she is my sister";
int i,j,k=0;
for(i=strlen(a);i>=0;i--)
{ k++;
if((a[i]!=' ')&& (i!=0))continue;
for(j=i;j<=k+i;j++)
printf("%c ",a[j]);
printf(' ');
k=0;
}
}


mikithebest 2007-05-25
  • 打赏
  • 举报
回复
以前没看清楚,以为只用倒置字母就行了。自己写了一个倒置单词的,代码有些长,但是不会出错,可以去掉多余的空格。
#include <stdio.h>
#include <stdlib.h>
#define MAXLETTER 100
int position;
char words[MAXLETTER][MAXLETTER];
void storage(char inputs[]);
int numofwords(char inputs[]);
main ()
{
int a;
char input[MAXLETTER];
gets(input);
storage(input);
for(a=numofwords(input)-1;a>=0;a--)printf ("%s ",words[a]);
system ("pause");
}
int numofwords(char inputs[])
{
int a,number=0;
for (a=1;a<=MAXLETTER-1;a++)
{
if ((inputs[a]==' '||inputs[a]=='\0')&&inputs[a-1]!=' ')number++;
if (inputs[a]=='\0')break;
}
return number;
}
void storage(char inputs[])
{
int a=0,b,c;
position=0;
while(position<=MAXLETTER)
{
if (inputs[position]=='\0')break;
b=0;
while (inputs[position]!=' ')
{
words[a][b]=inputs[position];
words[a][b+1]='\0';
position++;
b++;
if (inputs[position]==' ')a++;
}
position++;
}
}
lin_style 2007-05-24
  • 打赏
  • 举报
回复
虫子的代码厉害。 。
leejohn 2007-05-23
  • 打赏
  • 举报
回复
楼上的想法很巧妙啊,没用复杂的函数。
laiwusheng 2007-05-23
  • 打赏
  • 举报
回复
//用得着这么麻烦吗?
///////////////////////
main()
{ char a[]="she is my sister";
int i,j,k=0;
for(i=strlen(a);i>=0;i--)
{ k++;
if(a[i]!=' ')continue;
for(j=i;j<=k+i;j++)
printf("%c ",a[j]);
printf(' ');
k=0;
}
}

dai_weitao 2007-05-23
  • 打赏
  • 举报
回复
重点就在分离词汇,很简单。
abcd_abcd 2007-05-23
  • 打赏
  • 举报
回复
写了个垃圾代码,权且学习下。。。。。。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
char *sourceStr = "I am you";
char *desStr = (char *)malloc(20);
char *ptr;
char *temp;
int len = 0;

ptr = temp = sourceStr + strlen(sourceStr);
while ( ptr >= sourceStr )
{
if (*ptr == ' ' || *ptr == *sourceStr)
{
if (*ptr == ' ')
{
strncpy(desStr+len, ptr, temp-ptr);
len += temp-ptr;
temp = ptr;
ptr--;
}
else
{
strcpy(desStr+len, " ");
strncpy(desStr+len+1, ptr, 1);
ptr--;
}

}
else
ptr--;
}
strcpy(desStr+len+2, "\0");

puts(desStr);
free(desStr);
desStr = NULL;

return 0;
}
spofmy 2007-05-23
  • 打赏
  • 举报
回复
先把字符串全部倒过来,再把每个单词(以空格为界)倒过来。
sinovoice 2007-05-23
  • 打赏
  • 举报
回复
学习大家的方法,我这还有一个使用cstring的strtok()函数比较简单。
char string[]="I am you";
char *ps=" ";
char *token;
使用:
token = strtok( string, ps);
while( token != NULL )
{
/* While there are tokens in "string" */

//这里进行些数组操作
.....
/* Get next token: */
token = strtok( NULL, seps );
}
打印数组

FingerStyle 2007-05-23
  • 打赏
  • 举报
回复
string s;
cin >> s;
copy(s.rbegin(), s.rend(), ostream_iterator<char>(cout, ""));
fengdream 2007-05-23
  • 打赏
  • 举报
回复
经调试通过
int main()
{
char a[] = "I am you ";
char b[3][5];

for(int i=0,j=0,k=0;i<strlen(a);i++)
{
if(a[i]!=' ' && a[i+1]==' ')
{
memcpy(b[j],a+k, i-k+1);

b[j][i-k+1]='\0';
printf("%s\n",b[j]);
j++;
k=i+1; //flag the lastest blank;
}//end of if
}// end of for//*/

for(i=2;i>=0;i--)
printf("%s\n",b[i]);

return 0;
}
czdj2000 2007-05-23
  • 打赏
  • 举报
回复
sscanf
然后利用栈
加载更多回复(26)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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