编辑 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/