将一句话的单词进行倒置,标点不倒置。比如 "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;
}