首页 > 解决方案 > 在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);
}

标签: cstringswap

解决方案


虽然您不能将字符串文字 "TestString"传递给ft_strrev,但在 C99+ 中,您可以传递复合文字,例如(char[]){"TestString"}.

字符串文字,例如"TestString"只读内存中创建(通常在.rodata可执行文件的部分中)任何修改只读数据的尝试都会调用未定义的行为,如您所见。

复合文字,允许强制转换为创建允许修改的数组的数组。

ft_strrev, 虽然你的循环来获取字符串的长度很好,但要了解结果索引 - 是nul 终止字符的索引 - 你稍后尝试通过在交换期间和整个索引中减去来解决。 节省自己的悲伤,并在开始交换之前简单地减去。例如,一个方便的地方是:1strtemp1a

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.


推荐阅读