【发布时间】:2018-12-15 10:10:45
【问题描述】:
我正在尝试解决一个练习 5.7。来自 ANSI C 书:
练习 5.7。重写 readlines 以将行存储在 main 提供的数组中,而不是调用 alloc 来维护存储。程序快多少?
这是我的以下代码:
#include <stdio.h>
#include <string.h>
#define ALLOCSIZE 10000
#define MAXBUF 10000
#define MAXLEN 1000
#define MAXLINES 5000
char * lineptr[MAXLINES];
static char allocbuf[ALLOCSIZE];
static char * allocp = allocbuf;
int readlines(char * lineptr[], int nlines);
void writelines(char * lineptr[], int nlines);
int mygetline(char *, int);
void qsort(char * lineptr[], int left, int right);
void swap(char * v[], int i, int j);
int main(void) {
int nlines;
if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
qsort(lineptr, 0, nlines - 1);
writelines(lineptr, nlines);
} else {
printf("error: input too big to sort\n");
return 1;
}
return 0;
}
int readlines(char * lineptr[], int maxlines) {
int len, nlines;
char line[MAXLEN];
nlines = 0;
while ((len = mygetline(line, MAXLEN)) > 1) {
if (nlines >= maxlines || len == 0)
return -1;
else {
line[len - 1] = '\0';
strcpy(lineptr[nlines++], line);
}
}
return nlines;
}
void writelines(char * lineptr[], int nlines) {
while (nlines-- > 0)
printf("%s\n", *lineptr++);
}
int mygetline(char s[], int lim) {
int c, i;
i = 0;
while (--lim > 0 && (c = getchar()) != EOF && c != '\n')
s[i++] = c;
if (c == '\n')
s[i++] = c;
s[i] = '\0';
return i;
}
void qsort(char * v[], int left, int right) {
int i, last;
if (left >= right)
return;
swap(v, left, (left + right) / 2);
last = left;
for (i = left + 1; i <= right; i++)
if (strcmp(v[i], v[left]) < 0)
swap(v, ++last, i);
swap(v, left, last);
qsort(v, left, last);
qsort(v, last + 1, right);
}
void swap(char * v[], int i, int j) {
char * temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
我无法弄清楚这个练习。我在 strcpy(lineptr[nlines++], line); 指令的 readlines 函数中遇到错误。我不知道为什么这条指令会导致分段错误错误。任何人都可以推荐如何修复分段错误或提出此练习的另一种解决方案吗?
【问题讨论】:
-
char * lineptr[MAXLINES];不会为字符串本身保留任何空间。您正在将字符串复制到未初始化的指针 -
我将
char * lineptr[MAXLINES];更改为char * lineptr[MAXLINES] = { '\0' };仍然出现分段错误错误。 -
初始化为 0 对你没有任何好处。您需要分配内存。
-
那是因为
'\0'等价于NULL。 拯救你的唯一方法是当你free一个NULL指针时,这是良性的。
标签: c