c++程序写一条反转句子不反转单词的方法。

只在
#include<stdio.h>
#include<windows.h>
while(..)
...省略
else if(choice==7)
{

补充!!!
}
最新回答
青衫

2025-03-31 03:07:03

提供一个思路,代码分成两步,第一翻转整个字符串,第二部翻转单词。

#include<iostream>
#include<string.h>
#include<assert.h>
using namespace std;
/*
 * 这是2015年大数据云计算工程师百度校招的题目
 * 题目说不适用任何库函数,实现英语文章的逆序输出,
 * 也就是最后一个单词变成第一个单词,以此类推.
 * 以下为程序实现.
 * */
 /*第一种方法,严格意义上说使用了new操作符*/
char* reverse(char * word);
/*另外一种策略,严格意义上说其调用了求解字符串长度的库函数,需要自行实现这个函数*/
void Reverse(char *pbegin,char *pend);
char *ReverseSentence(char *str);
int main()
{
        char temp[] = {"There are so many sth."};
        cout<<ReverseSentence(temp)<<endl;
        return 0;
}
char* reverse(char * word)
{
        int length = -1;
        int count = 0;
        int index=0;
        while(word[++length] != '\0');
        cout<<length<<endl;
        char *temp = new char[length + 1];
        for(int i = length - 1; i >= 0; i --)
        {
                if (word[i] != ' ')
                {
                        count++;
                        continue;
                }
                for(int j = i  + 1; j < count + i  + 1; j++)
                {
                        temp[index++] = word[j];
                }
                count = 0;
                temp[index++] = ' ';
        }
        count = 0;
        while(word[count] != ' ')
        {
            temp[index++] = word[count];
            count++;
            }
        temp[index] = '\0';
        return temp;

}

void Reverse(char *pbegin,char *pend)
{
    if(pbegin==NULL||pend==NULL)
        return;
    while(pbegin<pend)
    {
        char tmp;
        tmp=*pbegin;
        *pbegin=*pend;
        *pend=tmp;
        ++pbegin;
        --pend;
    }
}
char *ReverseSentence(char *str)
{
    assert(str!=NULL);
    Reverse(str,str+strlen(str)-1);
    char *base=str;
    int WordLen=0;
    char *WordBase=str;
    while(*str!='\0')
    {
        if(*str!=' ')
            ++WordLen;
        else
        {
            Reverse(WordBase,WordBase+WordLen-1);
            WordLen=0;
            WordBase=str+1;
        }
        str++;
    }
    Reverse(WordBase,WordBase+WordLen-1);
    return base;
}
默看〆这一切

2025-03-31 01:58:25

可以用后进先出的栈来处理,这是最简单、高效的方式。简单说,就是遇到空格就入栈前面的单词,到最后,依次出栈,所以,最后入栈就是最后出栈的,而且不用反转单词,比楼下诸位的代码效率都要高很多。必看代码长,很简单,不懂加QQ 2544632890 。完整代码如下(gcc调试通过):

#include <stdio.h>
#define MAXCNT 20//这是最大单词个数,这里是20

typedef struct
{
char *words[MAXCNT];//这是存储各个单词的指针的数组
int top;//这是最近访问的单词在数组中的下标,指向最后一个单词
}Stack,*PStack;//这样定义了两个数据类型,一个是一个栈,另一个则是指向这种类型的指针

void push(char *p,PStack s)
{
if(s->top==MAXCNT-1)//已经访问到最后一个数组空间,即存满了20个单词,出错
return;
else//否则top向后移动一位,并记下指针
{
s->top++;
s->words[s->top]=p;
}
}
char *pop(PStack s)
{
s->top--;//这里让top向前移动一位,但返回的时候是返回它后面那个数组空间的值,所以下面这句加1
return s->words[s->top+1];
}

int main(void)
{
char str[50]="I am a happy student!";//这里随便什么都行
char *pch=str;
Stack s;
s.top=-1;//开始时没有一个单词,所以,要为-1
push(pch,&s);//默认第一个是单词,因此将其先入栈,不是空格,否则出错
while(*pch!='\0')//遍历字符串
{
if(*pch!=' ')
{
pch++;//在单词内部,向后移指针
}
else//已到单词末尾,将空格改为字符串结束标志,以此分割单词
{
*pch='\0';
pch++;
push(pch,&s);//将新单词指针入栈
}

}
while(s.top!=-1)//依次出栈输出
{
printf("%s ",pop(&s));

}

return 0;
}
万能女神

2025-03-31 01:51:07

#include <iostream>
#include <string>
using namespace std;


void InverseString(char* p, char* q){

while(q-p >= 1){
*p = *p^*q;
*q = *p^*q;
*p = *p^*q;
p++;
q--;
}
}

int main()
{
char str[] = "I come from tianjian.";
int iStrLen  = strlen(str);
InverseString(str,str+strlen(str)-1);

char *p = str;
char *q = str;
while (*p != '\0')
{
if (*p == ' '){
InverseString(q,p-1);
q = p+1;
}
p++;
}

printf(str);printf("\n");

    return 0;
}
侞此の゛肤浅

2025-03-31 03:14:14

你给的提示这是什么啊?和题目有关么?
追问
就是像输入: I am so happy.
输出:happy. so am I
追答
#include <stdio.h>
#include <string.h>
int main()
{
char str[100];
char *p;
gets(str);
p=strrchr(str, ' ');
while( p )
{
*p='\0';
p++;
printf("%s ", p );
p=strrchr(str, ' ');
}
printf("%s\n", str );
return 0;
}
追问
老师不让用#include 
p=strrchr(str, ' ');
类似这种的- -。。。我也蛋疼不知道怎么做。
追答
#include <stdio.h>
int main()
{
char str[100];
char *p=str;
gets(str);
while( *p ) p++ ;
while( p!=str )
{
p--;
if ( *p == ' ' )
{
*p='\0';
if ( *(p+1) )
printf("%s", p+1 );
printf(" ");
}
}
if ( str[0] )
printf("%s\n", str );
return 0;
}