粉红猪在飞 2024-05-29 17:22 采纳率: 70.6%
浏览 27
已结题

本关任务:改写函数 int readlines(char *lineptr[ ], int maxlines),将输入的多个文本行存储到 main 函数提供的一个数组中。这个代码错在哪


#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;
}
  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-29 17:22
    关注

    引自免费微信小程序:皆我百晓生

    在给定的代码中,存在一些小问题,但整体结构是正确的。下面是修改后的代码,包括了对问题的修复以及添加了一些注释来解释所做的更改。

    #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;
    }
    

    主要更正如下:

    1. 包含 <stdlib.h> 头文件以使用 mallocrealloc
    2. main() 中,在读取前清空分配的内存(memset(allocation, 0, sizeof(allocation));)以防止遗留数据。
    3. readlines() 函数中,使用 realloc 替换 malloc 来扩展内存区域并复制字符串。
    4. 在排序后,在 main() 函数中删除已分配的内存(for (int i = 0; i < nlines; i++) { free(lineptr[i]); })。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月5日
  • 已采纳回答 6月27日
  • 创建了问题 5月29日

悬赏问题

  • ¥15 虚拟机检测,可以是封装好的DLL,可付费
  • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)
  • ¥30 使用matlab将观测点聚合成多条目标轨迹
  • ¥15 Workbench中材料库无法更新,如何解决?
  • ¥20 如何推断此服务器配置
  • ¥15 关于github的项目怎么在pycharm上面运行
  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的