颠倒句子中的单词顺序

题目内容:

从键盘输入一个句子(假设字符数小于100个),句子中的单词之间用空格分隔,句子必须以一个标点符号作为结尾,句子开头和末尾标点符号前均没有空格,以回车表示输入结束,请编程颠倒句中的单词顺序并输出。

函数原型:int Inverse(char str1[], char str2[][N])

程序运行结果示例1:

Input a sentence:you can cage a swallow can’t you?↙

you can’t swallow a cage can you?

程序运行结果示例2:

Input a string:you are my sunshine!↙

sunshine my are you!

程序运行结果示例3:

Input a sentence:I love you!↙

you love I!

输入提示信息:“Input a sentence:”

输入格式: 用gets()函数

输出格式

每个单词的输出格式:"%s " (注意: %s后面有一个空格)

最后一个单词和标点符号的输出格式:"%s%c\n"

方法1(数组)

#include<stdio.h>
#include<string.h>
#define N 100
int Inverse(char str1[], char str2[][N]);
int main()
{
   char str1[N],str2[N][N],a;
   int i=0,j;
   gets(str1);
   a=str1[strlen(str1)-1];                //将字符串在结尾处的标点符号保存起来。
   str1[strlen(str1)-1]='\0';             //将str1数组变成了没有标点符号的字符串,由此排除了标点符号的干扰。
   j=Inverse(str1,str2);
   for(i=j;i>0;i--)
   {
     printf("%s ",str2[i]);
   }
   printf("%s%c\n",str2[i],a);
   return 0;
}

int Inverse(char str1[], char str2[][N])   //此函数的功能是将输入的一维数组每个单词拆开存进二维数组中,返回值为单词个数。
{
   int len=strlen(str1);
   int i=0,j=0,k=0;
   while(str1[i]!='\0')
   {
     k=0;
     while(str1[i]!=' '&&str1[i]!='\0')
     {
      str2[j][k]=str1[i];
      k++;
      i++;
     }
     if(str1[i]=='\0') break;
     str2[j][k]='\0';
     j++;
     i++;
   }
   return j;
}

方法2(指针)

#include <stdio.h>
#include <string.h>
char *R(char *str, int len);
char *RS(char *str);
int main()
{
	char str[100], c;
	printf("Input a sentence:");
	gets(str);
	c =	str[strlen(str) - 1];
	str[strlen(str) - 1] = '\0';
	printf("%s%c\n", RS(str), c);
	return 0;
}

char *R(char *str, int len)             //将句子所有的字母颠倒顺序
	char *pLast = str + len - 1;
	char *pBegin = str;
	char temp;
	while (pBegin < pLast)
	{
		temp = *pBegin;
		*pBegin = *pLast;
		*pLast = temp;
		pBegin++;
		pLast--;
	}
	return str;
}

char *RS(char *str)
{
	char *pBegin = str;
	char *pEnd = str;
	R(str, strlen(str));                       //先将输入的一句话的所有字母全部颠倒顺序
	while (*pEnd != '\0')
	{
		while (*pEnd != '\0' && *pEnd != ' ')
		{
			pEnd++;
		}
		R(pBegin, pEnd - pBegin);           //将每个单词中的字母颠倒顺序,这样就变成了之前的顺序
		if(*pEnd == '\0')
		{
			break;
		}
		pEnd++;
		pBegin = pEnd;
	}
	return str;
}


你可能感兴趣的:(C语言经典例题)