#include <stdio.h>
#include <string.h>
#define MAXLINES 5000
#define MAXLEN 1000
char *lineptr[MAXLINES];
int readlines(char *lineptr[], char *allocation, int maxlines);
void writelines(char *lineptr[], int nlines);
void qsort(char *lineptr[], int left, int right);
int main() {
int nlines;
char line[MAXLEN], *p;
char allocation[10000];
printf("Please input passage:\n");
if ((nlines = readlines(lineptr, allocation, MAXLINES)) >= 0) {
qsort(lineptr, 0, nlines - 1);
writelines(lineptr, nlines);
return 0;
}
else {
printf("error: input too big to sort\n");
return 1;
}
}
int readlines(char *lineptr[], char *allocation, int maxlines) {
/**********begin**********/
int len, nlines = 0;
char *p, line[MAXLEN];
while ((len = getLine(line, MAXLEN)) > 0) {
if (nlines >= maxlines) {
// 如果已经达到最大行数或者无法分配内存,返回错误
return -1;
}
// 为当前行分配内存
if ((p = malloc(len)) == NULL) {
return -1;
}
// 复制当前行到新分配的内存空间
strcpy(p, line);
// 将新分配的内存空间的指针存入lineptr数组
lineptr[nlines++] = p;
}
return nlines;
/***********end**********/
}
void writelines(char *lineptr[], int nlines) {
int i;
for (i = 0; i < nlines; i++)
printf("%s\n", lineptr[i]);
return;
}
int getLine(char s[], int lim) {
int c, i;
for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
void qsort(char *v[], int left, int right) {
int i, last;
void swap(char *v[], int i, int j);
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 - 1);
qsort(v, last + 1, right);
return;
}
void swap(char *v[], int i, int j) {
char *temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
return 0;
}
本关任务:改写函数 int readlines(char *lineptr[ ], int maxlines),将输入的多个文本行存储到 main 函数提供的一个数组中。这个代码错在哪
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在给定的代码中,存在一些小问题,但整体结构是正确的。下面是修改后的代码,包括了对问题的修复以及添加了一些注释来解释所做的更改。
#include <stdio.h> #include <stdlib.h> // 添加此头文件以使用malloc和free #include <string.h> #define MAXLINES 5000 #define MAXLEN 1000 char *lineptr[MAXLINES]; int readlines(char *lineptr[], char *allocation, int maxlines); void writelines(char *lineptr[], int nlines); void qsort(char *lineptr[], int left, int right); int main() { int nlines; char line[MAXLEN], *p; char allocation[10000]; // 在读取之前,清空分配的内存,防止遗留数据 memset(allocation, 0, sizeof(allocation)); printf("Please input passage:\n"); if ((nlines = readlines(lineptr, allocation, MAXLINES)) >= 0) { qsort(lineptr, 0, nlines - 1); writelines(lineptr, nlines); // 在排序后释放动态分配的内存 for (int i = 0; i < nlines; i++) { free(lineptr[i]); } return 0; } else { printf("error: input too big to sort\n"); return 1; } } int readlines(char *lineptr[], char *allocation, int maxlines) { int len, nlines = 0; char *p, line[MAXLEN]; while ((len = getLine(line, MAXLEN)) > 0) { if (nlines >= maxlines) { // 如果已经达到最大行数或者无法分配内存,返回错误 return -1; } // 为当前行分配内存,并将其附加到已分配的内存区域 p = (char*) realloc(allocation, (nlines + 1) * MAXLEN); // 使用realloc而不是malloc if (p == NULL) { return -1; } allocation = p; // 复制当前行到新分配的内存空间 strcpy(allocation + (nlines * MAXLEN), line); // 将新分配的内存空间的指针存入lineptr数组 lineptr[nlines++] = allocation + (nlines * MAXLEN); } return nlines; } void writelines(char *lineptr[], int nlines) { int i; for (i = 0; i < nlines; i++) printf("%s\n", lineptr[i]); return; } int getLine(char s[], int lim) { int c, i; for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) s[i] = c; if (c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } void qsort(char *v[], int left, int right) { int i, last; void swap(char *v[], int i, int j); 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 - 1); qsort(v, last + 1, right); return; } void swap(char *v[], int i, int j) { char *temp; temp = v[i]; v[i] = v[j]; v[j] = temp; return 0; }
主要更正如下:
- 包含
<stdlib.h>
头文件以使用malloc
和realloc
。 - 在
main()
中,在读取前清空分配的内存(memset(allocation, 0, sizeof(allocation));
)以防止遗留数据。 - 在
readlines()
函数中,使用realloc
替换malloc
来扩展内存区域并复制字符串。 - 在排序后,在
main()
函数中删除已分配的内存(for (int i = 0; i < nlines; i++) { free(lineptr[i]); }
)。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决评论 打赏 举报 编辑记录无用 1- 包含
悬赏问题
- ¥15 虚拟机检测,可以是封装好的DLL,可付费
- ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)
- ¥30 使用matlab将观测点聚合成多条目标轨迹
- ¥15 Workbench中材料库无法更新,如何解决?
- ¥20 如何推断此服务器配置
- ¥15 关于github的项目怎么在pycharm上面运行
- ¥15 内存地址视频流转RTMP
- ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
- ¥15 有没有整苹果智能分拣线上图像数据
- ¥20 有没有人会这个东西的