c - 在c中交换字符串

标签 c string swap

我有一个小问题,我无法交换我的字符串,我有错误总线,我只能使用 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整个索引 strtemp交换期间。为自己省去悲伤,只需减去 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/

相关文章:

c - 为什么我在分配变量时出错,但变量具有相同的类型?

c - 从 fgets() 输入中删除尾随换行符

c - 交换链表中的节点

SQLite:如何交换仅留下 ID 列的两行

Java 从字符串中获取子字符串值

java - 在java中交换字符串中的两个子字符串

创造恒定的值(value)

c - 如何使用 read 将输出通过管道传输到 C 中的另一个程序

c - 如何在 C99 中迭代 char*?

Java - 使用参数写入、读取和修改字符串