我有一个小问题,我无法交换我的字符串,我有错误总线,我只能使用 while 功能 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 标准(输出最终 '\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
.
关于c - 在c中交换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51251583/