arrays - 程序“返回”并在循环中使用 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
解决方案
代码的问题在于您如何定义和访问数组。如果您包含-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
并且代码有效。
推荐阅读
- vespa - 应用程序初始化期间出错:ClusterSearcher 应具有顶级调度
- java - 从给定数字中减去完美平方的 2 人游戏算法
- git - 为不同构建反应原生项目自定义包名称
- asp.net-core-mvc - 我有一个复杂的视图模型,它构建了复杂的命名 html 元素。如何构建匹配的帖子模型?
- r - 用于 flexdashboard 闪亮应用的 Oauth2.0 流程
- java - getRuntime().exec(String[]) 函数的行为与 getRuntime().exec(String) (Android) 不同
- ruby-on-rails - 在 Ruby on Rails 中进行错误处理的正确方法
- r - 如何更新代码以创建用于计算韦尔奇多项式趋势的函数?
- c# - 在 Unity 中是否有一种快速调试移动振动的方法?
- git - GitLab - 确定分支是否受到终端 git 命令的保护