c - 调用数组的特定索引时,打印所有值

标签 c arrays pointers dynamic-memory-allocation

我使用此处找到的一段代码逐行读取 .txt 文件,我认为这应该将所有行添加到名为 words< 的数组中。每当我尝试从数组中返回一个值时,例如 printf(words[7]); 文本文档中的所有行都会被返回,而不仅仅是数组中的第 7 个值。是否所有的行都没有正确地拆分成一个数组,或者是否返回了数组的所有值?

void readFile() {
    FILE* fp; // Declare the file pointer

    int lines_allocated = 128;
    int max_line_len = 100;

    /* Allocate lines of text */
    char** words = (char**)malloc(sizeof(char*) * lines_allocated);
    if (words == NULL) {
        fprintf(stderr, "Out of memory (1).\n");
        exit(1);
    }

    switch (difficulty) // Open the file for read
    {
        case 'e':
            fp = fopen("words_easy.txt", "r");
            break;
        case 'm':
            fp = fopen("words_medium.txt", "r");
            break;
        case 'h':
            fp = fopen("words_hard.txt", "r");
            break;
        default:
            printf("Cannot open file");
    }
    if (fp == NULL) {
        fprintf(stderr, "Error opening file.\n");
        exit(2);
    }

    int i;
    for (i = 0; 1; i++) {
        int j;

        /* Have we gone over our line allocation? */
        if (i >= lines_allocated) {
            int new_size;

            /* Double our allocation and re-allocate */
            new_size = lines_allocated * 2;
            words = (char**)realloc(words, sizeof(char*) * new_size);
            if (words == NULL) {
                fprintf(stderr, "Out of memory.\n");
                exit(3);
            }
            lines_allocated = new_size;
        }
        /* Allocate space for the next line */
        words[i] = malloc(max_line_len);
        if (words[i] == NULL) {
            fprintf(stderr, "Out of memory (3).\n");
            exit(4);
        }
        if (fgets(words[i], max_line_len - 1, fp) == NULL)
            break;

        /* Get rid of CR or LF at end of line */
        for (j = strlen(words[i]) - 1;
             j >= 0 && (words[i][j] == '\n' || words[i][j] == '\r'); j--)
            ;
        words[i][j + 1] = '\0';
    }

    /* Close file */
    fclose(fp);

    int j;
    for (j = 0; j < i; j++)
        printf("%s\n", words[j]);

    /* Good practice to free memory */
    for (; i >= 0; i--)
        free(words[i]);
    free(words);
    printf(words[7]);
    return 0;
}

文档每行一个单词,我只是尝试打印一个单词作为测试,但是当我尝试从数组中调用一个值时,我将所有行输出到控制台。

最佳答案

为什么你的程序中需要这个 for 循环...???

int j;
for(j = 0; j < i; j++)
    printf("%s\n", words[j]);

关于c - 调用数组的特定索引时,打印所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29627265/

相关文章:

c - 为什么 GNOME 不使用 C99?

java - 如何将相似的对象添加到数组中?

C++ const 通过指针改变,或者是吗?

pointers - gob 试图解码 nil 值导致 EOF 错误

c++ - C++代码中的错误可能是指针未指向任何东西

c++ - 'continue' 使用标志作用于哪个循环?

c - 基本的简单分词器

c - 在 For 循环中使用增量

javascript - 释放 Javascript 对象使用的内存

java - 将父对象转换为子对象 - 数组中的奇怪行为