gpt4 book ai didi

c - 原地反转字符串中的词序

转载 作者:太空狗 更新时间:2023-10-29 17:03:22 25 4
gpt4 key购买 nike

我正在尝试颠倒句子中单词的顺序,例如:

This sentences words are reversed.

成为

reversed. are words sentences This

这是我目前所拥有的,几乎可以工作:我使用 strrev 函数反转字符串,然后使用 inprev 函数将每个单词单独发送到 strrev 函数,将它们反转回原始方向,但顺序相反。发送指向 strrev 函数开始和结束的指针可能看起来有点傻,但它允许在 inprev() 中使用相同的函数,发送指向单个单词开始和结束的指针。

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

void strrev(char * start, char * end);
void inprev(char * start);

int main(void)
{
char str[] = "Foobar my friends, foobar";
char * end = (str + strlen(str) -1);
puts(str);
strrev(str, end);
puts(str);
inprev(str);

puts(str);

return 0;
}

void strrev(char * start, char * end)
{
char temp;

while (end > start)
{
temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}

void inprev(char * start)
{
char * first = start;
char * spcpnt = start;
while (*spcpnt)
{
while (*spcpnt != ' ' && *spcpnt)
spcpnt++;
strrev(start, spcpnt-1); // removing the -1 sends the space on the
start = spcpnt++; // other side to be reversed, doesn't stop
// the problem.

}

}

这是输出:

Foobar my friends, foobar

raboof ,sdneirf ym rabooF

foobarfriends, my Foobar

问题是最后一个单词末尾缺少最后一个空格意味着该单词和最后一个字符串中的前一个单词之间缺少一个空格,而是被扔到最后一个单词的末尾,这是原始字符串中的第一个单词。去掉单词另一边的空格只会把问题转移到别处。谁能看到解决方案?

最佳答案

你只需要移动inprev函数中的start指针来跳过单词之间的空格。由于这似乎是家庭作业(如果我错了请纠正我)我只想说你需要做的就是移动一个运算符(operator)的位置。

但是,这会产生一个问题,即 inprev 执行缓冲区溢出,因为搜索没有正确终止。更好的方法是:

while not end of string
search for start of word
start = start of word
search for end of word
strrev (start, end)

这也将处理多个空间。此外,U+0020(ASCII 32,一个空格)不是唯一的空白字符。有测试字符的标准库函数。它们在 中并以 is... 开头,例如 isspace.

关于c - 原地反转字符串中的词序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7254031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com