顛倒句子中的單詞順序
阿新 • • 發佈:2018-12-30
題目內容:
從鍵盤輸入一個句子(假設字元數小於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;
}