c - 在c中交换字符串
问题描述
我有一个小问题,我不能交换我的字符串我有错误总线,我只能在函数 ft_strrev 时使用。我想是因为我的琴弦停不下来。泰
#include <stdio.h>
char *ft_strrev(char *str)
{
int i;
int a;
int temp;
i = 0;
a = 0;
while(str[a] != '\0')
{
a++;
}
printf ("%i\n", a);
while(i < a / 2 && a < 0)
{
temp = str[a - i - 1];
str[a - i - 1] = str[i];
str[i]= temp;
i++;
printf ("%c\n", str[i]);
}
return (str);
}
int main()
{
printf("TestString");
printf("%s", ft_strrev("TestString"));
return (0);
}
解决方案
虽然您不能将字符串文字 "TestString"
传递给ft_strrev
,但在 C99+ 中,您可以传递复合文字,例如(char[]){"TestString"}
.
字符串文字,例如"TestString"
在只读内存中创建(通常在.rodata
可执行文件的部分中)任何修改只读数据的尝试都会调用未定义的行为,如您所见。
复合文字,允许强制转换为创建允许修改的数组的数组。
在ft_strrev
, 虽然你的循环来获取字符串的长度很好,但要了解结果索引 - 是nul 终止字符的索引 - 你稍后尝试通过在交换期间和整个索引中减去来解决。 节省自己的悲伤,并在开始交换之前简单地减去。例如,一个方便的地方是:1
str
temp
1
a
printf ("%i\n", a--);
使用第一个字符的索引和最后一个字符的索引,您的循环逻辑简化为:
while (i < a) {
...
i++, a--;
}
(你也可以简单地使用指向第一个和最后一个字符的指针而不是数组索引——但这完全取决于你)
简化事情并在格式字符串中添加几个,'\n'
这样您的输出就不会全部混合在一起,并且您的程序符合 POSIX 标准(输出 final '\n'
),您可以执行以下操作:
#include <stdio.h>
char *ft_strrev(char *str)
{
int i = 0,
a = 0;
while (str[a])
a++;
printf ("%i\n", a--);
while (i < a) {
char temp = str[i];
str[i] = str[a];
str[a]= temp;
i++, a--;
}
return str;
}
int main (void)
{
printf ("TestString\n");
printf ("%s\n", ft_strrev ((char[]){"TestString"}));
return 0;
}
(您还应该if (str != NULL)
在开头检查ft_strrev
)
示例使用/输出
$ ./bin/cmplitrev
TestString
10
gnirtStseT
话虽如此,虽然复合文字100% 可以使用——除非您熟悉它,否则它并不是最易读的,因此您最好只需在其中声明一个字符数组main()
并将该数组作为参数传递给ft_strrev
.
推荐阅读
- python - 在 pyplot 中绘图时出现奇怪的字符
- angular - 根据响应正文更改有效负载
- multithreading - Visual Studio:线程等待的 AutoReset 事件能否用于非线程方法(例如在 Button1 中)?
- javascript - 实例化 select2 组合框时出现 JavaScript 运行时错误
- java - 回复KafkaTemplate / KafkaTemplate不发送/接收密钥
- angular - 发送 http.get 时从 Promise 中获取令牌
- php - Simple HTML Dom:选择和计算子元素(.eq 函数到 Simple HTML Dom)
- unity3d - 我只想在其他事件发生时实例化一个多维数据集
- pyspark-dataframes - 当有许多不同的值时如何过滤 Spark 数据框中的列
- ruby - 如何修复 Jekyll “找不到 JavaScript 运行时”错误