在字符串中反转字顺序

Mat*_*att 8 c string algorithm

我试图在一个句子中改变单词的顺序,例如:

这句话是相反的.

逆转.是单词句子这个

这是我到目前为止,它几乎可以工作:我使用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.  

     }

}
Run Code Online (Sandbox Code Playgroud)

这是输出:

Foobar我的朋友,foobar

raboof,sdneirf ym rabooF

foob​​arfriends,我的Foobar

问题是在最后一个单词的末尾缺少最后一个空格意味着该单词和最后一个单词中的前一个单词之间缺少一个空格,而是被抛到最后一个单词的末尾,这就是原始字符串中的第一个单词.发送单词另一侧的空格只会将问题移到其他地方.有谁能看到解决方案?

Ski*_*izz 5

您只需移动函数中的start指针inprev即可跳过单词之间的空格.因为这似乎是家庭作业(纠正我,如果我错了)我只会说你需要做的就是移动一个操作员的位置.

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

while not end of string
  search for start of word
  start = start of word
  search for end of word
  strrev (start, end)
Run Code Online (Sandbox Code Playgroud)

这也将照顾多个空间.此外,U + 0020(ASCII 32,空格)不是唯一的空格字符.有标准的库函数来测试字符.它们位于<ctype.h>中is...,例如,以...开头isspace.