题目内容:
从键盘输入一个句子(假设字符数小于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;
}