试图做“strrev”,没有强制转换的整数指针

时间:2014-04-16 09:54:54

标签: c segmentation-fault

编辑04/19/2014:

感谢每一个人,感谢你的回答,它终于成功了。我将留下我原来的帖子,以防其他初学者最终谈到这个话题,他可以从我的错误中吸取教训。 再次,谢谢你的时间,对不起,我不能早点感谢你,但我没有任何条件。 再见。

原始邮件:

我正在努力学习如何编码,但是我只想说我远离主级别( - 到目前为止! - )。

为了练习编程,我获得了大量带有大量练习的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编程方面走得太远。 我知道这看起来一定是个傻瓜,但我也可能需要你的帮助(然后我会让你一个人离开,我发誓)。

4 个答案:

答案 0 :(得分:0)

您无法修改"yolo"之类的字符串文字,它被视为常量。

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

char text[] = "yolo";

ft_strrev(text);

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

答案 1 :(得分:0)

文字字符串是只读的 您正在尝试更改文字字符串"yolo"

在函数内复制它或复制到数组

int main(void) {
    char notreadonly[] = "yolo";
    ft_strrev(notreadonly);
    return 0;
}

答案 2 :(得分:0)

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

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

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


}

int             main()
{
        char    str[] = "abcd";

        ft_strrev(str);
        return(0);
}

char *str;
str = "yolo";
char other_str[ft_strlen(str)+1];
ft_strcpy(other_str, str);
ft_strrev(other_str);

答案 3 :(得分:0)

首先,正如之前@pmg和@unwind所建议的那样,您正在尝试修改一个无法修改的字符串文字;你可能想看看Difference between char *str="STRING" and char str[] = "STRING"?

其次,在ft_strrev()中,逆转的逻辑是有缺陷的;它实际上并没有反转字符串,以下调用是错误的: -

ft_swap(str [i],str [j]); / *当期望char *时传递char * /

您可以将其更改为: -         而(i                 ft_swap(&amp; str [i],&amp; str [j-i]);                 我++;         }