将一句话的单词进行倒置,标点不倒置。比如 "I like beijing.",经过处理后变为:"beijing. like I"。
字符串长度不超过100。
输入一个仅包含小写字母、空格、'.' 的字符串,长度不超过100。'.' 只出现在最后一个单词的末尾。
依次输出倒置之后的字符串,以空格分割。
I like beijing.
beijing. like I
#include<stdio.h> void reserve() { char arr[100]; if ((scanf("%s",arr))!=EOF) { reserve(); printf("%s ",arr); } } int main() { reserve(); return 0; }使用递归函数 从后往前打印
#include <stdio.h> #include<assert.h> void reverse(char*left,char*right) { assert(left); assert(right); while(left<right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } int main() { char arr[101] = {0}; gets(arr); int len = strlen(arr); reverse(arr,arr+len-1); char*start=arr; while(*start) { char*end=start; while(*end != ' ' && *end != '\0') { end++; } reverse(start,end-1); if(*end != '\0') end++; start = end; } printf("%s\n",arr); return 0; }用C语言解出,思路是先整体反转,在进行每个单词的反转,用句号和空格判断单词。
#include <stdio.h> int main() { char input[100]; gets(input); int index = 0; char str[100][100] = {0}; int x = 0,y = 0; while(input[index] != '\0'){ if(input[index] == ' '){ y = 0; x++; }else { str[x][y] = input[index]; y++; } index++; } index = 0; for(int i = x; i >= 0; i--){ index = 0; while(str[i][index] != '\0'){ printf("%c",str[i][index]); index++; } printf(" "); } }
#include <stdio.h> #include <assert.h> #include <string.h> void Reverse_arr(char* left, char* right) { assert(left); assert(right); char tem = 0; while (left < right) { tem = *left; *left = *right; *right = tem; left++; right--; } } int main() { char arr[101] = { 0 }; int len = 0; char* left = NULL; char* right = NULL; //读取 gets(arr); len = strlen(arr); right = &arr[len - 1]; left = &arr[0]; //逆序整个句子 Reverse_arr(left, right); //逆序每一个单词 while (*right != '\0') { right = left; //right在正常情况下,遇到空格就可以判断单词结束,进行逆序单词操作了 //但还有一种特殊情况:单词在句子的末尾。 //此时right指向的不是空格,而是'\0' //所以要把这2种情况都加上 while (*right != ' ' && *right != '\0') { right++; } //此时right指向空格,所以要自减1再传入逆序函数 Reverse_arr(left, right - 1); left = right + 1; } //输出 printf("%s\n", arr); return 0; }
#include <stdio.h> #include<string.h> void revers(char* left, char *right) { while (left < right) { char a = *left; *left = *right; *right = a; left++; right--; } } int main() { char arr[101]; gets(arr); int a = strlen(arr); revers(arr, arr + a - 1); char* start = arr; char* end = arr; while(*start) { while (*end != ' ' && *end != '\0') { end++; } revers(start, end - 1); if (*end) { end++; } start = end; } printf("%s\n", arr); return 0; }
#include <iostream> #include<string> #include<algorithm> using namespace std; int main() { string s1; getline(cin,s1); //先整体逆置 reverse(s1.begin(),s1.end()); //再以空格划分区间进行分段逆置回来 //在先逆序之后最后加入有空格,防止最后一个单词找不到的情况 s1+=" "; auto it=s1.begin(); auto back= find(s1.begin(),s1.end(),' '); while(back!=s1.end()) { reverse(it,back); it=back+1; back=find(it,s1.end(),' '); } for(auto x:s1) { cout<<x; } }
//从最后一个字符开始往前找空格,遇到空格就置为'\0', //然后从'\0'的下一个字符开始打印,得到一个单词#include<stdio.h> int main() { char arr[100] = { 0 }; while (gets(arr)) { int right = strlen(arr) - 1;//right是指字符串中最后一个字符的下标 arr[right + 1] = '\0';//最后一个字符的下一个元素置为'\0',方便一会打印 while (right >= 0)//当下标小于0停止循环 { if (arr[right] == ' ')//从最后一个字符元素开始往前找,当数组元素是空格时,说明这往后是一个单词 { printf("%s ", &arr[right + 1]);//空格下一个元素开始打印该单词 arr[right] = '\0';//把空格置为'\0',方便打印下一个单词 } else if (right == 0)//说明遇到了最前面的单词了 { printf("%s", &arr[right]); } right--;//下标不断递减 } printf("\n"); } return 0; }
#include <stdio.h> void reverse(char* left, char* right) { while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } int main() { char arr[101] = {0}; gets(arr); int len = strlen(arr); //1.逆序整个字符串 reverse(arr, arr + len - 1); //2.逆序单词 char* start = arr; while (*start) { char* end = start; while (*end != ' '&&*end!='\0') { end++; } reverse(start, end - 1); if(*end!='\0') end++; start = end; } printf("%s", arr); return 0; }