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