翻转字符串中的单词顺序

时间:2021-10-20 15:48:49
就是把"put up you hands!"翻转成"hands! you up put",
用C语言,除了用栈,还有别的方法吗?比如说结构体?
写一个翻转字符串的函数
char * Reverse(const char* string)
{

29 个解决方案

#1


用栈挺好的啊,只是要实现个栈麻烦一点。
用结构体? 不会,呵呵,关注学习

#2


该回复被版主删除

#3


楼主是不是写错了?

#4


有思想。。个人感觉有点麻烦:

说下大致的思想:

  定义个指针; 指针指到最后;指针一个一个左移 遇到'\0'就是“空格”结束,此时把指针所指的输出。。就这样一个一个的输出来。。

这个思想太麻烦。我一时也想不出来,回家在给你想吧!想好了给你贴上。

#5


#include <stdio.h>
void RevStr(char src[])
{
    char *start=src, *end=src, *p=src,e;
    int i=0;
    do
    {
        if(*p==' '|| *p==','|| *p=='.'|| *p==';'||! *p)
        {
            i=1;
            end=p-1;
            while(start < end)e= *start, *start++= *end, *end--=e;
        }
        if(i)start=p+1,i=0;
    }while(*p++);
    while(*end++);end-=2;
    while(src < end)e= *src, *src++= *end, *end--=e;
}

//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------

int main()
{
    char src[]="put up you hands!",pause;
    printf("%s\n",src);
    RevStr(src);
    printf("%s\n",src);
    scanf("%c",&pause);
    return 0;
}

#6


#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include<iterator>
#include<algorithm>
using namespace std;
int main()
{
    string test="put up you hands!";
    stringstream ss(test);
    vector<string> str_vec;
    str_vec.assign(istream_iterator<string>(ss),istream_iterator<string>());
    ss.clear();
    copy(str_vec.rbegin(),str_vec.rend(),ostream_iterator<string>(ss," "));
    test=ss.str();
    cout<<test<<endl;
    system("PAUSE");
    return 0;
}

#7


敢问下楼上的学C多少年拉 从事计算机这行多少年拉?
崇拜

#8


这个问题好像已经有很多兄弟研究过了
也提出了很多简单有效的方法
今天既然有人提出用栈 把以前写过的一个只有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;
}

#9


学习

#10


可以去俺的blog瞅瞅

http://blog.csdn.net/ammana_babi/archive/2006/09/11/1207025.aspx


本程序在Turbo C 2.0下编译通过,在使用VC.NET和Dev C++ 4.9 进行编译的时候提示写冲突。

#include <stdio.h>

char * mystrcat(char * dst,const char *src)

{

   char *start = dst;

   while(*dst)dst++;

   while(*dst++ = *src++);

   return start;

}/*其实就是C库函数strcat(),因为不让使用C库函数,所以只好自己写出来了。*/

char * wordrev(char *str)

{

   char *start,*p,*pp;

   p=(char *)str;

   pp =p;

   while(*p)        p++;

   while(*p != ' ') p--;  

   start = p+1;

   *p = '\0';

   while(p >= pp)

   {

      while(*p != ' ')

      {

        p--;

        if(p == pp)

        {

           mystrcat(start," ");

           mystrcat(start,p);

           break;

        }

      }

      if(p != pp)

      {

        mystrcat(start,p);

        *p = '\0';

      }

   }

   return start;

}

void main(void)

{

   char * str = "I am a student";

   puts(wordrev(str));

   getchar();

}

 

#11


CSDN里的牛人真多,崇拜你们啊!

#12


結構體也不是不行,

typedef struct{
char *out;
}linker;

linker str[N];
char * Reverse(const char* string)
{
   int i;
   str[0].out=strtok(string," ");
   while(str[++i].out=strtok(NULL," "));
   
   for(--i;i>=0;i--) printf("%s ",str[i].out);
}
//手上沒有編譯器沒有調適,參考一下ba le

#13


i=0開始沒有給值,+上去吧

#14


为什么我的程序执行到 *p='\0' 就会报内存出错?

#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;
}

#16


mark

#17


我的思路是先在空格的地方赋‘\0’,在从后向前查找下个‘\0’,输入‘\0’后面的字符串,

#18


不用栈,可以用循环~

#19


昨天刚好做了一个
#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;
}

#20


有du51(郁郁思扬)这么好的解决方案,还要说其它的吗?

#21


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;
}

#22


呵呵  学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);
}

#23


上面有个小错误   修改后如下  不好意思啊  粗心大意了  修改后简洁点 
#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);
}

#24


汗  复制错误   再发
#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);
}

#25


w  是来拜牛人的..

#26


好好利用用下那个空格就行了啊~~~~~~~~~~~~~~~用那个空格来判断,把空格转换成ASCII后判断,然后截取后在重新组装下就OK了~~~~~~~~~~~~~

#27


用指针移动最简单

#28


#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);
}

#29


http://community.csdn.net/Expert/topic/5232/5232012.xml?temp=.9141962
[超级大笨狼]提供三万单词库备份下载,MS-SQL 2000格式,下载请“自觉”捐赠可用分给我。

#1


用栈挺好的啊,只是要实现个栈麻烦一点。
用结构体? 不会,呵呵,关注学习

#2


该回复被版主删除

#3


楼主是不是写错了?

#4


有思想。。个人感觉有点麻烦:

说下大致的思想:

  定义个指针; 指针指到最后;指针一个一个左移 遇到'\0'就是“空格”结束,此时把指针所指的输出。。就这样一个一个的输出来。。

这个思想太麻烦。我一时也想不出来,回家在给你想吧!想好了给你贴上。

#5


#include <stdio.h>
void RevStr(char src[])
{
    char *start=src, *end=src, *p=src,e;
    int i=0;
    do
    {
        if(*p==' '|| *p==','|| *p=='.'|| *p==';'||! *p)
        {
            i=1;
            end=p-1;
            while(start < end)e= *start, *start++= *end, *end--=e;
        }
        if(i)start=p+1,i=0;
    }while(*p++);
    while(*end++);end-=2;
    while(src < end)e= *src, *src++= *end, *end--=e;
}

//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------

int main()
{
    char src[]="put up you hands!",pause;
    printf("%s\n",src);
    RevStr(src);
    printf("%s\n",src);
    scanf("%c",&pause);
    return 0;
}

#6


#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include<iterator>
#include<algorithm>
using namespace std;
int main()
{
    string test="put up you hands!";
    stringstream ss(test);
    vector<string> str_vec;
    str_vec.assign(istream_iterator<string>(ss),istream_iterator<string>());
    ss.clear();
    copy(str_vec.rbegin(),str_vec.rend(),ostream_iterator<string>(ss," "));
    test=ss.str();
    cout<<test<<endl;
    system("PAUSE");
    return 0;
}

#7


敢问下楼上的学C多少年拉 从事计算机这行多少年拉?
崇拜

#8


这个问题好像已经有很多兄弟研究过了
也提出了很多简单有效的方法
今天既然有人提出用栈 把以前写过的一个只有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;
}

#9


学习

#10


可以去俺的blog瞅瞅

http://blog.csdn.net/ammana_babi/archive/2006/09/11/1207025.aspx


本程序在Turbo C 2.0下编译通过,在使用VC.NET和Dev C++ 4.9 进行编译的时候提示写冲突。

#include <stdio.h>

char * mystrcat(char * dst,const char *src)

{

   char *start = dst;

   while(*dst)dst++;

   while(*dst++ = *src++);

   return start;

}/*其实就是C库函数strcat(),因为不让使用C库函数,所以只好自己写出来了。*/

char * wordrev(char *str)

{

   char *start,*p,*pp;

   p=(char *)str;

   pp =p;

   while(*p)        p++;

   while(*p != ' ') p--;  

   start = p+1;

   *p = '\0';

   while(p >= pp)

   {

      while(*p != ' ')

      {

        p--;

        if(p == pp)

        {

           mystrcat(start," ");

           mystrcat(start,p);

           break;

        }

      }

      if(p != pp)

      {

        mystrcat(start,p);

        *p = '\0';

      }

   }

   return start;

}

void main(void)

{

   char * str = "I am a student";

   puts(wordrev(str));

   getchar();

}

 

#11


CSDN里的牛人真多,崇拜你们啊!

#12


結構體也不是不行,

typedef struct{
char *out;
}linker;

linker str[N];
char * Reverse(const char* string)
{
   int i;
   str[0].out=strtok(string," ");
   while(str[++i].out=strtok(NULL," "));
   
   for(--i;i>=0;i--) printf("%s ",str[i].out);
}
//手上沒有編譯器沒有調適,參考一下ba le

#13


i=0開始沒有給值,+上去吧

#14


为什么我的程序执行到 *p='\0' 就会报内存出错?

#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;
}

#16


mark

#17


我的思路是先在空格的地方赋‘\0’,在从后向前查找下个‘\0’,输入‘\0’后面的字符串,

#18


不用栈,可以用循环~

#19


昨天刚好做了一个
#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;
}

#20


有du51(郁郁思扬)这么好的解决方案,还要说其它的吗?

#21


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;
}

#22


呵呵  学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);
}

#23


上面有个小错误   修改后如下  不好意思啊  粗心大意了  修改后简洁点 
#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);
}

#24


汗  复制错误   再发
#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);
}

#25


w  是来拜牛人的..

#26


好好利用用下那个空格就行了啊~~~~~~~~~~~~~~~用那个空格来判断,把空格转换成ASCII后判断,然后截取后在重新组装下就OK了~~~~~~~~~~~~~

#27


用指针移动最简单

#28


#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);
}

#29


http://community.csdn.net/Expert/topic/5232/5232012.xml?temp=.9141962
[超级大笨狼]提供三万单词库备份下载,MS-SQL 2000格式,下载请“自觉”捐赠可用分给我。