c - 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;
}
错误:“信号:分段错误(核心转储)”
解决方案
您的代码中有多个错误。明显的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.
这里有三个问题:
通过从头到尾重写一个字符,您并没有进行交换。您只是从头到尾复制数据(但肯定是按相反的顺序)。原件丢失。
您实际上是经过两次,因为当时间
i
达到间隔的一半时,a
它们会不断减少并且它们交叉。现在i
仍然需要完成循环并a
继续向您已经到过的字符串的开头。如果您确实进行了交换,则将 1 与 2 交换,然后再将 2 与 1 交换,从而使原始内容保持不变!(次要)返回的字符串
(f)gets
以换行符结尾,因此它成为结果的开头。可能不是您想要的,但是在将字符串喂给您的函数之前可以轻松地将其切掉。
您需要处理其中的每一个,其他答案现在包含一些建议。但是我认为运行你的代码并尝试“像机器一样思考”来解释为什么计算机会误解你的意图是有启发性的。如果您通过在临时变量中复制一个字母来交换字母,然后重写str[i]
,然后str[a-1]
从临时变量中回写,然后停止i
并a
相互交叉,您可以亲眼看到您将处理 1 和 2。
推荐阅读
- c++ - 正确执行运算符重载和多态性
- c# - Azure 广告身份验证不适用于带有 angular 5.2 新模板的新 asp.net core 2.1。由于我们不在新模板中路由到主控制器
- javascript - 根据数组过滤对象的属性。并获取过滤后的对象
- wordpress - 如何更改 Wordpress 中每个帖子的首字母?
- mysql - Galera:索引大数据时无法写入数据库
- javascript - 151 未捕获的类型错误:删除第二个费用元素时,无法读取 null 的属性“parentNode”
- javascript - 在方法中应用媒体查询?
- spring-boot - @JmsListener 没有从集成测试中调用
- amazon-web-services - 如何使用 Route 53 将多个子域映射到单个云端分布
- angular - 如何从 Angular 7 中的 Firestore 查询中获取数据的 Observable?