【问题标题】:Reverse each word in a string using C使用C反转字符串中的每个单词
【发布时间】:2016-02-08 03:27:32
【问题描述】:

好的,所以这段代码几乎可以工作,只是它弄乱了每一行的结尾。 例如,如果我有一个包含以下三行的文本文件作为标准输入:

This is a test
For you to see
How this code messes up

输出读数:

siht si a
tsetroF uoy ot
eeswoH siht edoc sessem
pu

如果你发现了什么,请告诉我 谢谢

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


void reverseWords(char *str)
{
  char *beg = NULL;
  char *temp = str;
  while (*temp)
  {
    if ((beg == NULL) && (*temp != ' '))
    {
      beg = temp;
    }
    if (beg && ((*(temp + 1) == ' ') || (*(temp + 1) == '\0')))
    {
      reverse(beg, temp);
      beg = NULL;
    }
  temp++;
  }
}

【问题讨论】:

  • 甚至不看你的代码,很明显,行为是它在每行末尾包含换行符作为行中最后一个单词的一部分。因此,它将换行符作为最后一个单词的第一个字符,从而产生观察到的输出。您需要代码来处理换行符。
  • 我在第二个 if 语句中将 +1 更改为 +2,第二次有加法。似乎工作

标签: c arrays string char reverse


【解决方案1】:

不考虑代码中的新行。

在下面的代码中,我将所有出现的*something == ' ' 更改为对新添加的方法isWhiteSpace 的调用,如果被检查的字符是空格、制表符、换行符或回车符:

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

int isWhiteSpace(char value)
{
  return value == ' ' || value == '\t' || value == '\r' || value == '\n';
}


void reverseWords(char *str)
{
  char *beg = NULL;
  char *temp = str;
  while (*temp)
  {
    if ((beg == NULL) && !isWhiteSpace(*temp))
    {
      beg = temp;
    }
    if (beg && (isWhiteSpace(*(temp + 1)) || (*(temp + 1) == '\0')))
    {
      reverse(beg, temp);
      beg = NULL;
    }
  temp++;
  }
}

【讨论】:

  • 出于某种原因,我确信我是在您上面的评论的基础上构建的,但显然其他观众并不清楚。谢谢。
  • 注意:代码可以使用标准库函数和return isspace((unsigned char) value);。 C 至少有 6 个空白字符。
  • @chux,感谢您的评论,我更愿意展示实现以更清楚地了解正在发生的事情。但当然使用 CRT 方法更合适。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2013-11-13
相关资源
最近更新 更多