作为序言:我对编程和C语言都非常陌生。我正在经历K&R,我正在尝试解决练习1-19。
我不明白是什么导致了j == i;行中的分段错误。
我一直在尝试各种代码组合来找出问题所在。
按照练习,我最初有一个循环来尝试反转字符数组,但是通过故障排除,我得出了j == i;线。
这两个值似乎没什么问题,但是尝试比较它们会给我一个错误。
#include <stdio.h>
#define MAXLENGTH 1000
int reverse(char line[]);
main()
{
int c = 0;
char line[MAXLENGTH];
while ((c = reverse(line)) != EOF) {
printf("%s\n", c);
}
return 0;
}
int reverse(char line[])
{
char r[MAXLENGTH];
int i, c, j, l;
i = c = j = l = 0;
printf("BEFORE GETARRAY\n");
while ((c = getchar()) != '\n' && c != EOF) {
line[i] = c;
i++;
printf("i: %d\n", i);
}
l = i - 1;
printf("i: %d\n", i);
printf("l: %d\n", l);
printf("j: %d\n", j);
printf("BEFORE REVERSING\n");
j == i;
return c;
我希望比较能够毫无错误地结束。
如果您不仅可以描述错误所在,还可以描述原因,以便我可以尝试改进,那将是很棒的事情。
答案 0 :(得分:3)
j == i;
行未引起此问题,它没有执行任何操作。问题在这里:
while ((c = reverse(line)) != EOF) {
printf("%s\n", c);
}
您正在尝试打印一个字符串,但您给了它c
,它是一个int
。将错误的数据类型传递给printf
是未定义的行为,这就是导致分段错误的原因。您可能想要这样:
printf("%s\n", line);
还请注意,您尚未对字符串进行null终止。在reverse
函数中,您需要:
printf("BEFORE REVERSING\n");
line[i] = '\0';
答案 1 :(得分:2)
第j == i
行与您的细分错误完全无关。细分错误的主要问题是您的printf("%s\n", c);
语句。因为您尝试在传递int作为参数的同时打印字符串。如果要打印getchar
的结果,可以使用函数putchar
或作为替代方法printf("%c")
。试试这个,它应该不会崩溃。
#include <stdio.h>
#define MAXLENGTH 1000
int reverse(char line[]);
int main()
{
int c = 0;
char line[MAXLENGTH];
while ((c = reverse(line)) != EOF) {
putchar(c);
}
return 0;
}
int reverse(char line[])
{
int i, c, j, l;
i = c = j = l = 0;
printf("BEFORE GETARRAY\n");
while ((c = getchar()) != '\n' && c != EOF) {
line[i] = c;
i++;
printf("i: %d\n", i);
}
l = i - 1;
printf("i: %d\n", i);
printf("l: %d\n", l);
printf("j: %d\n", j);
printf("BEFORE REVERSING\n");
return c;
}
我也删除了多余的j == i
语句。