首页 > 解决方案 > C中的反转字符串

问题描述

我只想通过切换字符串中每个索引的位置来反转字符串顺序。

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

void FirstReverse(char str[]) {  
  int a = strlen(str);

  for(int i=0; i<strlen(str) ;i++){
    str[i] = str[a-1];
    a-=1;
  }
}

int main(void) {
  // keep this function call here
  FirstReverse(gets(stdin));
  return 0;    
}

错误:“信号:分段错误(核心转储)”

标签: cstringreverse

解决方案


您的代码中有多个错误。明显的gets是使用错误(老实说,它完全被使用)并且它不会以任何方式输出结果。但是,让我们应用一些快速修复,对您的逻辑进行最小的更改:

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

void FirstReverse(char str[]) {
  int a = strlen(str);

  for(int i=0; i<strlen(str) ;i++){
    str[i] = str[a-1];
    a-=1;
  }
}

int main(void) {
  char string[100];  // This is going to be our working field where the changes happen
  fgets(string, 100, stdin);  // read a line of up to 100 characters into "string"
  FirstReverse(string);  // do the work (this could be chained, like it was originally)
  puts(string);  // output the result
  return 0;
}

现在它编译并执行没有失败,但结果是错误的:

在:我最喜欢的字符串

出: gnirts ette 字符串

什么地方出了错?让我们逐步了解发生的情况:

i                  a
↓                  ↓
My favourite string
(program writes the last character [see point 3 below] in place of `M`)

 ↓                ↓
 y favourite string
(program writes `g` in place of `y`)

  ↓              ↓
 g favourite string
(program writes `n` in place of the space)

   ↓            ↓
 gnfavourite string
(program writes `i` in place of `f`)

etc.
         ia
         ↓↓
 gnirts eite string
(program writes `t` in place of `i`)

         ai
         ↓↓
 gnirts ette string
(program writes `t` in place of `t`)

        a  i
        ↓  ↓
 gnirts ette string
(program writes `e` in place of `e`)
etc.

这里有三个问题:

  1. 通过从头到尾重写一个字符,您并没有进行交换。您只是从头到尾复制数据(但肯定是按相反的顺序)。原件丢失。

  2. 您实际上是经过两次,因为当时间i达到间隔的一半时,a它们会不断减少并且它们交叉。现在i仍然需要完成循环并a继续向您已经到过的字符串的开头。如果您确实进行了交换,则将 1 与 2 交换,然后再将 2 与 1 交换,从而使原始内容保持不变!

  3. (次要)返回的字符串(f)gets以换行符结尾,因此它成为结果的开头。可能不是您想要的,但是在将字符串喂给您的函数之前可以轻松地将其切掉。

您需要处理其中的每一个,其他答案现在包含一些建议。但是我认为运行你的代码并尝试“像机器一样思考”来解释为什么计算机会误解你的意图是有启发性的。如果您通过在临时变量中复制一个字母来交换字母,然后重写str[i],然后str[a-1]从临时变量中回写,然后停止ia相互交叉,您可以亲眼看到您将处理 1 和 2。


推荐阅读