在数组中存储文本行,C
我是C语言的新手,我对如何读取文件并将每一行存储到数组的索引感到困惑 示例文件: 天空是什么颜色在数组中存储文本行,C,c,arrays,string,char,allegro,C,Arrays,String,Char,Allegro,我是C语言的新手,我对如何读取文件并将每一行存储到数组的索引感到困惑 示例文件: 天空是什么颜色红色橙色黄色蓝色 代码的预期结果: 输入[0]=天空是什么颜色输入[1]=红色输入[2]= 橙色输入[3]=黄色输入[4]=蓝色 H到目前为止,我所掌握的情况如下: char input[60]; //declare string array of size 80, for 80 lines for(int i = 0; fgets(input, sizeof(input), inFile)!=N
红色
橙色
黄色
蓝色
代码的预期结果: 输入[0]=天空是什么颜色
输入[1]=红色
输入[2]= 橙色
输入[3]=黄色
输入[4]=蓝色
H到目前为止,我所掌握的情况如下:
char input[60];
//declare string array of size 80, for 80 lines
for(int i = 0; fgets(input, sizeof(input), inFile)!=NULL; i++){
//string[i] = input; storing this line to the string index
}
//later on use the string[80] that now has all lines
我知道声明
input[60]
只决定每行的长度,而不是行数。我已经习惯于思考其他编码语言中的字符串,以至于使用char让我感到厌烦。我尝试过视频教程,但它们对我没有帮助。文件的每一行都是不同的字符串,每个字符串都是指向数组的char*指针;因此,您需要的是一个一维字符*指针数组(或者一个二维字符数组)
您可以初始化二维字符数组,也可以为每行1D char*指针malloc内存
下面是malloc方法的一个示例。存储在其中的变量称为“行”,而不是“输入”;但是,如果愿意,您可以交换变量名,并更改打印格式以解决特定问题。这只是一个将字符串读入内存的示例,与您希望的方式相同。没有一个实际系统的堆空间小于4K,因此我省略了malloc内存检查
#include <string.h>
#include <malloc.h>
#include <stdio.h>
#define MAX_LINES 10
#define MAX_LEN 60
int main( int narg, char *arg[] ) {
char input[ MAX_LEN ];
char *line[ MAX_LINES ];
FILE *inFile;
int i,j;
if ( narg != 2 ){fprintf( stderr, "Use: %s filename\n", arg[0] ); return 2;}
if (!(inFile=fopen(arg[1],"r") )){
fprintf( stderr, "Can't open '%s'\n",arg[1]);
return 2;
}
for ( i=0; i<MAX_LINES && fgets(input, sizeof(input), inFile ); ++i ) {
int lineLen=strlen(input) + 1;
line[i] = strncpy( malloc( lineLen ), input, lineLen );
}
for ( j=0; j<i; ++j ) { printf( "Line %d:%s", j+1, line[j] ); free(line[j]); }
fclose(inFile);
return 0;
}
#包括
#包括
#包括
#定义最多10行
#定义最大长度60
int main(int narg,char*arg[]){
字符输入[MAX_LEN];
字符*行[最大行];
文件*填充;
int i,j;
如果(narg!=2){fprintf(stderr,“使用:%s文件名\n”,arg[0]);返回2;}
如果(!(infle=fopen(arg[1],“r”)){
fprintf(stderr,“无法打开“%s”\n”,arg[1]);
返回2;
}
对于(i=0;iMakestring
一个字符数组,并使用?您是否熟悉通过malloc()
等进行动态内存分配?如果是,您可以使用它来复制您读取的字符串(行)。如果您没有介绍malloc()
和free()
但是,然后使用更简单但不太灵活的2D字符数组。不要忘记删除数据中包含的换行符。fgets()
。(既然您有一条关于80行大小的字符串数组的注释,您打算在那里写什么?为什么不写呢?)如果您不确定如何在C中声明2D数组,那么在不重复教科书应该告诉您的内容的情况下很难帮助您。我们将帮助您诚实地解决问题,但我们不会简单地为您编写代码。解决您的问题的方法有很多;我们不知道您的课程笔记和讲课内容es希望您使用。是的,使用字符数组[80][70];
将允许您存储多达80行,每行最多70个字符,其中字符计数包括终止的空字节(因此最多69个可显示字符,最后一个空字节)。不清楚为什么strcpy(数组[i],输入)
将使您的程序崩溃,除非您的输入行数超过80行。您应该检查是否超出数组的末尾(即i
未达到或超过80行)。请阅读有关创建MCVE的内容()。这有助于我们更好地帮助您。谢谢JonathanLeffler和@Some Programmer dude!我在您的指导下解决了这个问题。这里显示的样式缩进不正确,在任何代码审阅和/或编程作业中都会给您一个“请解释”。请不要像您显示的那样在一行上放多个语句;空白(换行)便宜,即使在堆栈溢出时也是如此。我注意到您在保存的数据中包含了换行符。这是允许的,并且允许您在printf()
语句中省略格式字符串末尾的换行符。在line[I]=strncpy(malloc(lineLen)中使用它之前,您应该检查malloc()
是否成功,输入,lineLen)
。虽然这可能在测试程序中大部分时间都有效,但对于专业开发工作来说并不安全。@kingsley;是的,它是安全的。但是任何C程序员都知道大括号的含义,并且一眼就能看到80个字符或更少的短线。格式化是故意的,因为如果开篇海报是为homewo复制的话rk,如果不理解,他们将受到处罚。如果他们试图“学习”,关于某个特定的细节…他们将为家庭作业编写自己的代码。strlen
,strncpy
,malloc
,副本可以用strdup
替换。。。
#include <string.h>
#include <malloc.h>
#include <stdio.h>
#define MAX_LINES 10
#define MAX_LEN 60
int main( int narg, char *arg[] ) {
char input[ MAX_LEN ];
char *line[ MAX_LINES ];
FILE *inFile;
int i,j;
if ( narg != 2 ){fprintf( stderr, "Use: %s filename\n", arg[0] ); return 2;}
if (!(inFile=fopen(arg[1],"r") )){
fprintf( stderr, "Can't open '%s'\n",arg[1]);
return 2;
}
for ( i=0; i<MAX_LINES && fgets(input, sizeof(input), inFile ); ++i ) {
int lineLen=strlen(input) + 1;
line[i] = strncpy( malloc( lineLen ), input, lineLen );
}
for ( j=0; j<i; ++j ) { printf( "Line %d:%s", j+1, line[j] ); free(line[j]); }
fclose(inFile);
return 0;
}