首页 > 解决方案 > 程序“返回”并在循环中使用 2d 字符数组指针退出?

问题描述

我真的对我的程序的行为感到困惑。我正在尝试从文件中读取并将整个文件表示为 2d char 数组,但由于某种原因,每当我尝试将 char 分配给该数组中的元素时,它似乎只是“返回”或退出。 .任何想法我在这里缺少什么?

(哦,我希望它在前 10 个字符之后被切断)

非常感谢。(编辑:添加标题和主要)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

int main() {
    FILE *fpin;

    fpin = fopen("tester.txt", "r");

    char (*strings)[20][10];      //Array of strings contains entire file
    bool continueReading = true; //boolean for end of file: end of file = 0

/* ===THIS WORKS===
    (*strings)[0][0] = 'f';
    printf("\nPutting character: %c", (*strings)[0][0]);
    return 0;
*/
    int whileLoops = 0;
    while (continueReading)
    {
        //grab first char
        char ch = fgetc(fpin);

        //if no charaters exist break
        if (ch == EOF)
        {
            break;
        }
        if (ch != '\n' && ch != EOF)
        {
            printf("\nPutting character: %c", ch);
            printf(" in Strings - %d", whileLoops);
            printf(" - 0");
            (*strings)[whileLoops][0] = ch;
/* === PROGRAM TERMINATES HERE, NO ERRORS ??? === */
        }

        for (int i = 1; i < 10; i++)
        {

            //concat char by passing to array
            ch = fgetc(fpin); //repeat with next char from infile

            if (ch == '\n') // newline char
            {
                break; //break here go back into while loop
            }
            else if (ch == EOF)
            {
                continueReading = false;
                break;
            }

            if (ch != '\n' && ch != EOF)
            {
                printf("\nPutting character: %c", ch);
                printf(" in Strings - %d", whileLoops);
                printf(" - %d", i);
                (*strings)[whileLoops][i] = ch;
            }

            if (i+1 >= 10)
            {
                while (1)
                {
                    ch = fgetc(fpin); //repeat with next char from infile
                    if (ch == '\n' || ch == EOF)   // newline char
                    {
                        break; //break here go back into while loop
                    }
                }
            }
        }
        whileLoops++;
    }

    fclose(fpin);
    return 0;
}

输入文件:

Tony Buffet
Kailey Heson
Art Johnson
John Pernanski

输出:

Putting character: T in Strings - 0 - 0

标签: arrayscpointers

解决方案


代码的问题在于您如何定义和访问数组。如果您包含-Wall标志,编译器会暗示这一点:

$ gcc main.c -o main -Wall
main.c: In function 'main':
main.c:35:39: warning: 'strings' may be used uninitialized in this function [-Wmaybe-uninitialized]
   35 |             (*strings)[whileLoops][0] = ch;
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~

char (*strings)[20][10]定义了一个指向二维数组的指针,而你想要的只是数组:char strings[20][10]. 现在您可以使用访问数组strings[whileLoops][0] = ch并且代码有效。


推荐阅读