【前言】


今天是刷题打卡第41天!

再接再厉鸭亲们。


【手把手带你刷好题】—— 41.说反话(C初阶测试、字符串)_字符串

原题:倒置字符串

题目描述:


将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I 


方法一: 低级解法

思路:


使用gets函数读入一整行,(想想为什么不用scanf()?),从左至右枚举每一个字符,以空格为分隔符对单词进行划分,并按照顺序存放到二维字符数组中,最后按单词输入顺序的逆序来输出所有单词。 


代码执行: 

#include<stdio.h>
#include<string.h>

int main()
{
char arr[100] = { 0 };
gets(arr);
int len = strlen(arr);
int row = 0;
int col = 0;
int i = 0;
char str[100][100] = { 0 };
for (i = 0; i < len; i++)
{
if (arr[i] != ' ')//如果读到的字符不是空格,放到str数组中,并且令col++
{
str[row][col] = arr[i];
col++;
}
else//如果读到的字符是空格,在str数组中放置\0,并且令row++,置col为0
{
str[row][col] = '\0';
row++;
col = 0;
}
}
for (i = row; i >= 0; i--)//逆序打印,注意哦,最后一个单词后面不要打印空格
{
printf("%s", str[i]);
if (i > 0)
printf(" ");
}
return 0;
}

方法二:高级解法

代码执行:

#include<stdio.h>
#include<string.h>
#include<assert.h>

void reverse(char* start, char* end)
{
assert(start && end);
while (start < end)
{
char temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}

int main()
{
char arr[100] = { 0 };
gets(arr);
int len = strlen(arr);
//1、先逆置每个单词
//2、再逆置整个字符串
char* start = arr;
char* end = start;
while (*end != '\0')
{
if(*end != ' ' && *end != '\0')//注意,最后一个单词后面跟着是\0,比较特殊别忘记多加考虑
{
end++;
}
reverse(start, end - 1);
if (*end == ' ')//这个判断语句要要注意理解一下,当end访问到\0时start就不要往后面走了
{
start = end + 1;
}
else
{
start = end;
}
end = start;
}
//逆置整个字符串
reverse(arr, arr + len - 1);
puts(arr);
return 0;
}

结语 


今天是刷题打卡第41天!

加油吧少年。


【手把手带你刷好题】—— 41.说反话(C初阶测试、字符串)_#include_02