我的代码按预期工作,但最后会出现"分段错误(核心转储("错误。我在网上阅读,这意味着我正在尝试访问不应该访问的内存,但我不知道如何解决这个问题。该程序应该按照ASCII顺序对终端中给出的参数进行排序和打印。
这是代码:
#include<unistd.h>
int c_strcmp(char *str1, char *str2)
{
int i;
i = 0;
while (str1[i] || str2[i])
{
if (str1[i] > str2[i])
return (1);
if (str1[i] < str2[i])
return (-1);
i++;
}
return (0);
}
void c_putstr(char *str)
{
int i;
i = 0;
while (str[i])
{
write(1, &str[i], 1);
i++;
}
write(1, "n", 1);
}
int main(int argc, char *argv[])
{
int i;
char *temp;
i = 1;
while (i < (argc - 1))
{
if (c_strcmp(argv[i], argv[i + 1]) > 0)
{
temp = argv[i];
argv[i] = argv[i + 1];
argv[i + 1] = temp;
i = 0;
}
i++;
}
i = 0;
while (i < argc)
{
i++;
c_putstr(argv[i]);
}
}
这是一项学校作业,我只能使用"写"功能。
以下是我得到的两个输出示例:
a2-r2-p8% ./a.out test2 test3 test1 test4 | cat -e
test1
test2
test3
test4
zsh: segmentation fault (core dumped) ./a.out test2 test3 test1 test4 |
zsh: done cat -e
a2-r2-p8% ./a.out abg b cdf abc z azz | cat -e
abc
abg
azz
b
cdf
z
zsh: segmentation fault (core dumped) ./a.out abg b cdf abc z azz |
zsh: done cat -e
因此,程序确实正确地排序和打印,但在最后还是会出错。有人知道我能做些什么来解决这个问题吗?
在最后一个循环中
i = 0;
while (i < argc)
{
i++;
c_putstr(argv[i]);
}
检查i
,但在索引之前将其递增。这意味着最后处理的元素是sentinel值NULL
,您将尝试在输出函数中取消引用该值。
因此,如果您不想报告可执行文件名,请向下移动i++;
,并从1
开始
i = 1;
while (i < argc)
{
c_putstr(argv[i]);
i++;
}