Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在数组中存储文本行,C_C_Arrays_String_Char_Allegro - Fatal编程技术网

在数组中存储文本行,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

我是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)!=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;iMake
string
一个字符数组,并使用?您是否熟悉通过
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;                                                                   
}