将句子中的单词位置倒置,标点不用倒置,例如i love you.倒置结果是:you. love i。
采用两步翻转法来实现单词位置的倒置。首先,它整体翻转整个字符串,然后再逐个翻转每个单词内的字符。
#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
是找到的单词的末尾索引。i
和WordEnd
用来交换单词内部的字符,直到单词被翻转到其原始顺序。main
函数:
arr
:一个足够大的字符数组,用来存储用户通过gets_s
函数输入的字符串。gets_s(arr, 10001)
:安全地读取用户输入的字符串。gets_s
是一个安全版本的函数,用于避免缓冲区溢出,第二个参数表示最大的字符串长度。ReverseString(arr)
:调用前面定义的ReverseString
函数,传入用户输入的字符串arr
。printf("%s\n", arr)
:打印经过单词顺序翻转后的字符串。运行结果:
从字符串的最后读取字符串内容,用两个数组存储,将原数组从尾部读取到首部,把单词一个个填入新数组中。
#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
函数处理这个字符串,并将结果打印出来。
运行结果: