一、倒置句子
将句子中的单词位置倒置,标点不用倒置,例如i love you.倒置结果是:you. love i。
1、两步翻转法
采用两步翻转法来实现单词位置的倒置。首先,它整体翻转整个字符串,然后再逐个翻转每个单词内的字符。
#include <stdio.h>
#include <string.h>
void ReverseString(char* ptr)
{
char temp = '\0';
int length = (int)strlen(ptr);
int i = 0,j = 0;
for (i = 0,j = length - 1; i < length / 2; i++,j--)
{
temp = *(ptr + j);
*(ptr + j) = *(ptr + i);
*(ptr + i) = temp;
}
for (i = 0,j = 0; i < length; i++)
{
j = i;
while (*(ptr + j) != ' ' && j < length)
{
j++;
}
int WordEnd = j - 1;
while (i < WordEnd)
{
temp = *(ptr + i);
*(ptr + i) = *(ptr + WordEnd);
*(ptr + WordEnd) = temp;
i++;
WordEnd--;
}
i = j;
}
}
int main()
{
char arr[10001] = { '\0' };
fgets(arr, 10001,stdin);
ReverseString(arr);
printf("%s\n", arr);
return 0;
}
工作流程:
-
函数定义:
void ReverseString(char* ptr)
:这是一个自定义函数,接收一个字符串指针ptr
作为参数,旨在反转该字符串中单词的顺序。
-
变量声明和初始化:
temp
:用于字符交换的临时变量。length
:通过调用strlen(ptr)
得到输入字符串的长度。i
和j
:作为索引变量在字符串操作中使用。
-
第一个for循环:整体翻转字符串
- 这个循环负责将整个字符串从头到尾翻转。通过交换指针
ptr
指向的首尾两端的字符,利用索引i
从头开始,索引j
从尾开始,直到它们相遇在字符串的中间。
- 这个循环负责将整个字符串从头到尾翻转。通过交换指针
-
第二个for循环:翻转单词内的字符
- 在字符串被整体反转之后,这个循环的目的是将每个单词内部的字符顺序重新翻转到正确的顺序。
i
从字符串的开始位置遍历,j
用来查找单词的结尾(即空格字符或字符串的末尾)。WordEnd
是找到的单词的末尾索引。- 当内部的while循环开始时,
i
和WordEnd
用来交换单词内部的字符,直到单词被翻转到其原始顺序。
-
main
函数:arr
:一个足够大的字符数组,用来存储用户通过gets_s
函数输入的字符串。gets_s(arr, 10001)
:安全地读取用户输入的字符串。gets_s
是一个安全版本的函数,用于避免缓冲区溢出,第二个参数表示最大的字符串长度。ReverseString(arr)
:调用前面定义的ReverseString
函数,传入用户输入的字符串arr
。printf("%s\n", arr)
:打印经过单词顺序翻转后的字符串。
运行结果:
2、倒读翻转法
从字符串的最后读取字符串内容,用两个数组存储,将原数组从尾部读取到首部,把单词一个个填入新数组中。
#include <stdio.h>
#include <string.h>
void ReverseString(char* ptr1, char* ptr2)
{
int len = strlen(ptr1);
ptr1 += len;
while (len > 0)
{
while (*(ptr1) != ' ' && len > 0)
{
if (len != 1)
{
ptr1--;
}
len--;
}
char* ptr3 = NULL;
if (len > 0)
{
ptr3 = ptr1 + 1;
}
else
{
ptr3 = ptr1;
}
while (*(ptr3) != ' ' && *(ptr3) != '\0')
{
*ptr2++ = *ptr3++;
}
if (len > 0)
{
*ptr2++ = ' ';
ptr1--;
if (len != 1)
{
len--;
}
}
}
}
int main()
{
char arr1[100] = { '\0' };
char arr2[100] = { '\0' };
fgets(arr1, 100,stdin);
ReverseString(arr1, arr2);
printf("%s\n", arr2);
return 0;
}
主要函数 ReverseString
进行详细分析:
-
首先获取输入字符串
ptr1
的长度,并将指针移动到字符串的末尾。 -
while
循环开始迭代,每次循环都是处理字符串中的一个单词。 -
内部的
while
循环负责找到单词的开始位置。它通过回退解析字符串,直到找到一个空格,这表示一个单词的结束。特别注意,如果长度为1,指针不回退,这处理了字符串开头的特殊情况,即第一个单词是一个字母的情况,例如第一个单词是I。 -
一旦找到空格或者到达字符串的开始,指针
ptr3
被设置为当前单词的第一个字符。 -
接下来的
while
循环将当前单词复制到输出字符串ptr2
中。该循环依次复制字符,直到遇到空格或字符串终止符 \0 ,循环结束后这个单词完成复制。 -
如果还没有处理完所有字符(
len > 0
),在ptr2
中添加一个空格以分隔单词,并将ptr1
指针再次回退一个字符以找到下一个单词的结束。 -
这个过程不断重复,直到处理完所有的字符(即
len
为0)。 -
在
main
函数中,通过gets_s
函数从用户那里接受一个字符串。然后调用ReverseString
函数处理这个字符串,并将结果打印出来。
运行结果: