翻转字符串中的单词顺序

k1x2d3 2006-09-13 09:40:56
就是把"put up you hands!"翻转成"hands! you up put",
用C语言,除了用栈,还有别的方法吗?比如说结构体?
写一个翻转字符串的函数
char * Reverse(const char* string)
{
...全文
947 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级大笨狼 2006-12-15
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/5232/5232012.xml?temp=.9141962
[超级大笨狼]提供三万单词库备份下载,MS-SQL 2000格式,下载请“自觉”捐赠可用分给我。
wyp2120 2006-10-26
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<string.h>
void main()
{
char str[11]={"I LOVE YOU"};
char st[11];
int i=0;
st[10]='\0';
char *p;
p=str;
for(i=0;i<3;i++)
st[i]=*(p+7+i);
st[3]=32;
for(i=0;i<4;i++)
st[i+4]=*(p+i+2);
st[8]=32;
st[9]=*p;
printf("%s\n",st);
}
wyp2120 2006-10-26
  • 打赏
  • 举报
回复
用指针移动最简单
golden_sunflower 2006-10-25
  • 打赏
  • 举报
回复
w 是来拜牛人的..
吴冬冬 2006-10-25
  • 打赏
  • 举报
回复
汗 复制错误 再发
#include<stdio.h>
#include<string.h>

void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;

printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
name2[n]=' ';
for(i=0;i<=n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
name2[n]='\0';
printf("\n%s\n",name2);
}
吴冬冬 2006-10-25
  • 打赏
  • 举报
回复
上面有个小错误 修改后如下 不好意思啊 粗心大意了 修改后简洁点
#include<stdio.h>
#include<string.h>

void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;

printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
for(i=0;i<n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
k=m+1;
for(j=k,s=0;s<(n-k)/2;j++,s++)
{
temp=name2[k];
name2[k]=name2[n-s-1];
name2[n-s-1]=temp;
}

name2[n]='\0';
printf("\n%s\n",name2);
}
吴冬冬 2006-10-25
  • 打赏
  • 举报
回复
呵呵 学C刚一个月 应该是最低级的方法做的 看看好使不? 好使楼主自己转换为函数 :)
#include<stdio.h>
#include<string.h>

void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;

printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
for(i=0;i<n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
k=m+1;
for(j=k,s=0;s<(n-k)/2;j++,s++)
{
temp=name2[k];
name2[k]=name2[n-s-1];
name2[n-s-1]=temp;
}

name2[n]='\0';
printf("\n%s\n",name2);
}
wyp2120 2006-10-25
  • 打赏
  • 举报
回复
好好利用用下那个空格就行了啊~~~~~~~~~~~~~~~用那个空格来判断,把空格转换成ASCII后判断,然后截取后在重新组装下就OK了~~~~~~~~~~~~~
swteetlove 2006-10-24
  • 打赏
  • 举报
回复
void reverseWords(char str[])
{
int start=0,end=0,length;
length=strlen(str);
ReverseString(str,start,length-1);
while(end<length){
if(str[end]!=' '){
start=end;
while(end<length&&str[end]!=' ')
end++;
end--;
ReverseString(str,start,end);
}
end++;
}
return;
}


void Reversestring(char str[],int start,int end){
char temp;
while(end>start){
temp=str[start];
str[start]=str[end];
str[end]=temp;
start++; end--;
}
return;
}
kkcs 2006-10-24
  • 打赏
  • 举报
回复
有du51(郁郁思扬)这么好的解决方案,还要说其它的吗?
wjh1127 2006-10-24
  • 打赏
  • 举报
回复
昨天刚好做了一个
#include <iostream.h>
char str[]= "hands! you up put";
void rev( char* p, int l)
{
char *h=p, *t=p+l;
char c;
int count=0;
while(count!=l/2+1)
{
c=*t;
*t=*h;
*h=c;
t--;
h++;
count++;
}
}

int findl( char* p,char ch)
{
char *pt=p;
int count=0;
while( (*pt!=ch) && (*pt!='\0') )
{
count++;
pt++;
}
return count;
}

void main()
{
int len;
int ch=' ';

len=findl(str, '\0');
rev(str,len-1);

char *p=str;
while( *p!='\0')
{
while(*p==ch)
{
p++;

}
int l=findl(p,ch);
rev(p, l-1);
p=p+l;

}
cout<<str<<endl;
}
飞哥 2006-10-24
  • 打赏
  • 举报
回复
不用栈,可以用循环~
leilei821006 2006-10-24
  • 打赏
  • 举报
回复
我的思路是先在空格的地方赋‘\0’,在从后向前查找下个‘\0’,输入‘\0’后面的字符串,
whatsblog 2006-10-24
  • 打赏
  • 举报
回复
mark
k1x2d3 2006-09-15
  • 打赏
  • 举报
回复
为什么我的程序执行到 *p='\0' 就会报内存出错?
zengjie_0_2001 2006-09-15
  • 打赏
  • 举报
回复
用堆栈的实现
#include <stdio.h>
#include <stdlib.h>

struct s_node{
char data;
struct s_node *next;
};
typedef struct s_node s_list;
typedef s_list *link;
link stack;

void push(char data){
link newnode;
newnode = (link)malloc(sizeof(s_list));
newnode->data = data;
newnode->next = stack;
stack = newnode;
}

char pop(){
link top;
char temp;
top = stack;
stack = stack->next;
temp = top->data;
free(top);
return temp;
}

int main(int argc, char **argv){
printf("this is a stringreverse c file!\n");
char *str = "put up your hands! yuy yuyu uyuy";
char *temp = str;
while(*temp)temp++;
int num = 0;
int init = 0;
temp--;
while(*str){
if(init == 0){
push(' ');
init++;
num++;
}
push(*(temp--));
num++;
if(*temp == ' '){
while(num > 0){
printf("%c",pop());
num--;
}
}
str++;
}
while(num > 0){
printf("%c",pop());
num--;
}
return 0;
}
iambtk 2006-09-14
  • 打赏
  • 举报
回复
楼主是不是写错了?
qdhuxp 2006-09-14
  • 打赏
  • 举报
回复
学习
Heaven_Redsky 2006-09-14
  • 打赏
  • 举报
回复
这个问题好像已经有很多兄弟研究过了
也提出了很多简单有效的方法
今天既然有人提出用栈 把以前写过的一个只有5各元素大小的模拟栈实现贴出来凑凑数吧
写得很粗糙 不好意思了
#include <tchar.h>
#include <iostream>
#include <windows.h>

using namespace std;

void sentenceReverse(const char* strIn, char* strOut)
{
int len = 0;
int i = 0;
int count = 0;
int countSpace = 0;
char *temp[5];


for(int j = 0; j < 5, *(strIn + i) != '\0'; j++){
temp[j] = new char;
while(*(strIn + i) != '\40'&& *(strIn + i) != '\0' && *(strIn + i) != '.' && *(strIn + i) != '!'){
i++;
}
memcpy(temp[j], strIn + count, i - count);
memcpy(temp[j] + i - count + 1, "\0", 1);

if(*(strIn + i) == '\40'){
countSpace++;
}
count = 1 + i++;
}

for(; j < 5; j++){
temp[j] = new char;
memcpy(temp[j], "\0", 1);
}


char *stack[5];
for(int k = 0; k < 5; k++){
stack[k] = temp[4 - k];
}

for(k = 4 - countSpace; k < 5; k++){
memcpy(strOut + len, stack[k], strlen(stack[k]));
len = len + static_cast<int>(strlen(stack[k]));
memcpy(strOut + len - 1, "\40", 1);
}
cout << strOut << endl;
delete [] (*stack);
}
int _tmain(int argc, _TCHAR* argv[])
{
char* str = "i am a student!";
char* strOut = new char(static_cast<int>(strlen(str)));
sentenceReverse(str, strOut);
Sleep(5000);
return 0;
}
Arthur_ 2006-09-14
  • 打赏
  • 举报
回复
i=0開始沒有給值,+上去吧
加载更多回复(8)

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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