c - 尝试执行 "strrev",来自整数的指针而不进行强制转换

标签 c segmentation-fault

编辑 2014 年 4 月 19 日:

谢谢大家,多亏了你们的解答,终于成功了。我将在下面留下我原来的帖子,以防其他初学者最终讨论这个主题,他可以从我的错误中学习。 再次感谢您抽出时间,很抱歉我没能尽快感谢您,但我当时情况不佳。 再见。

原帖:

我正在尝试学习如何编码,但只能说我距离大师水平还很远( - 到目前为止! - )。

为了练习编程,我得到了一堆包含大量练习的 PDF,当然,我被其中的一个困住了。

我必须创建一个“ft_strrev”,它会反转字符串。这是我到目前为止所做的:

#include <unistd.h>

void            ft_putchar(char c)
{
        write (1, &c, 1);
}

void            ft_putstr(char *str)
{
        int     i;
        i = 0;

        while (str[i] != '\0')
        {
                ft_putchar(str[i]);
                i++;
        }
}

int             ft_strlen(char *str)
{
        int     i;
        i = 0;

        while (str[i] != '\0')
        {
                i++;
        }
        return(i);
}

void            ft_strrev(char *str)
{
        int     i;
        int     j;
        char    *str2;

        i = 0;
        j = ft_strlen(str);
        str2 = str;

        while (j != 0)
        {
                str[i] = str2[j];
                i++;
                j--;

        }
        ft_putstr(str);

}

int             main()
{
        ft_strrev("yolo");
        return(0);
}

抱歉,如果您的眼睛流血或发生其他情况=)

所以我遇到了段错误,我现在多次尝试更改内容,但没有帮助。我想了解为什么以及如何解决这个问题。

已经谢谢了,抱歉我的英语水平很差。

<小时/>

编辑(我不知道是否应该删除之前的消息);

非常感谢大家。所以,在你的帮助下,我尝试改变很多事情。这是我现在拥有的:

ft_putchar(char c);
ft_putstr(char *str);
ft_serlen(char *str);

void            ft_swap(char *a, char *b)
{
        char    tmp;

        tmp = *a;
        *a = *b;
        *b = tmp;
}

void            ft_strrev(char *str)
{
        int     i;
        int     j;

        i = 0;
        j = ft_strlen(str) - 1;

        while (i < j/2)
        {
                ft_swap(str[i], str[j]);
                i++;
        }
        ft_putstr(str);


}

int             main()
{
        char    *str;
        str = "abcd\0";

        ft_strrev(str);
        return(0);
}

结果,gcc 告诉我:

$ gcc -Wall -Werror -Wextra ft_strrev.c
ft_strrev.c: In function ‘ft_strrev’:
ft_strrev.c:51:3: erreur: passing argument 1 of ‘ft_swap’ makes pointer from integer  without a cast [-Werror]
   ft_swap(str[i], str[j]);
   ^
ft_strrev.c:32:7: note: expected ‘char *’ but argument is of type ‘char’
 void  ft_swap(char *a, char *b)
       ^
ft_strrev.c:51:3: erreur: passing argument 2 of ‘ft_swap’ makes pointer from integer   without a cast [-Werror]
   ft_swap(str[i], str[j]);
   ^
ft_strrev.c:32:7: note: expected ‘char *’ but argument is of type ‘char’
 void  ft_swap(char *a, char *b)
       ^

所以并不是我不想尝试找出为什么它自己不起作用,而是我已经在其他练习中遇到了这个问题,而且我从未找到应该如何解决它,正如许多答案一样我在互联网上发现的这个问题没有帮助。如果这个问题没有得到解决,我认为我在 C 编程方面不会走得太远。 我知道这看起来一定很愚蠢,但我可能也需要你在这方面的帮助(然后我就不打扰你了,我发誓)。

最佳答案

您不能修改字符串文字,例如“yolo”,它被视为常量。

您可以使用数组解决此问题:

char text[] = "yolo";

ft_strrev(text);

我还质疑您的ft_strrev()中使用的逻辑/算法,它不会交换前面和后面的字符,而是只是将字符从后面复制到前面。这不会导致逆转。第一次复制会将第 0 个字符设置为终止符,创建长度为 0 的字符串。

关于c - 尝试执行 "strrev",来自整数的指针而不进行强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23105958/

相关文章:

c - 如何检测分配内存块的位置?

c - 在 Mac 上调试段错误?

c++ - 使用运算符重载添加两个数组对象会导致段错误

c - 声明大指针数组时 C 中的段错误

即使分配了内存,修改链表的 C 程序也会导致段错误

c - Linux/海湾合作委员会 : null address "00000000" with pthread compiler option

c++ - C++ 中的 rand() 函数

c++ - 令人抓狂的链表问题

c - 重新排列计算器 BODMAS 的数组

c - 检测连接