Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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
Arrays c语言中的内核转储与动态内存分配_Arrays_C_File_Struct_Dynamic Arrays - Fatal编程技术网

Arrays c语言中的内核转储与动态内存分配

Arrays c语言中的内核转储与动态内存分配,arrays,c,file,struct,dynamic-arrays,Arrays,C,File,Struct,Dynamic Arrays,在上面的程序中,我想做的是打开一个(.csv)文件,逐行读取它,然后将这些行传递给get_token函数,这样就可以生成token,我只需要那些有2个字段的行 我还想获取这两个标记的值,这样我就可以在add_record函数(我还没有编写)中传递它,并创建一个动态结构数组,这样我就可以对它进行排序并将其存储在其他文件中。 但我并没有得到字段的值,而是在运行输出时显示了核心转储。 因此,请帮助我解决这个问题以及结构的动态分配,因为我是c语言编程新手。如果我的代码伤害了您的眼睛,也很抱歉,您的代码中

在上面的程序中,我想做的是打开一个(.csv)文件,逐行读取它,然后将这些行传递给get_token函数,这样就可以生成token,我只需要那些有2个字段的行 我还想获取这两个标记的值,这样我就可以在add_record函数(我还没有编写)中传递它,并创建一个动态结构数组,这样我就可以对它进行排序并将其存储在其他文件中。 但我并没有得到字段的值,而是在运行输出时显示了核心转储。
因此,请帮助我解决这个问题以及结构的动态分配,因为我是c语言编程新手。如果我的代码伤害了您的眼睛,也很抱歉,您的代码中有一些错误。我已经修好了。只需比较两个代码文件,就可以了解代码的错误。大多数情况下,你把行放错地方了,不能写正确的算法等等

static int get_token(char *line, char fields[2][30], char *delim){
   char *token = strtok(line , delim);
   int flag = 0;
   while (token != NULL) {
        //printf("%s\n", token); 
        token = strtok(NULL, delim);
        if (flag == 0)
            strcpy(fields[flag], token);
        else if(flag == 1)
            strcpy(fields[flag], token);
   }
   return flag;
}

static void sort_data(){
   // printf("reading the file ...........");
   FILE *fileOpen = fopen( filename , "r");
   char line[LINE_SIZE];
   char fields [2][30];
   while(fgets(line, LINE_SIZE, fileOpen) != NULL){
         int no_of_token = get_token(line, fields, ",");
         printf("%d\n",no_of_token);
         if(no_of_token != 2){
               //printf(" number of fields is not 2 for entry %d",j);
               continue;
         }
   printf("%s \n %s",fields[0],fields[1]);
   }
}
输出:

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


#define LINE_SIZE 1024


int get_token(char *line, char fields[][30], char *delim) {
    int token_cnt = 0;

    char *token = strtok(line , delim);
    while(token != NULL) {
        // check if there is more than two tokens
        if(token_cnt >= 2) {
            return 3;
        }
        //printf("%s\n", token);
        strcpy(fields[token_cnt++], token);
        // update token
        token = strtok(NULL, delim);
    }

    return token_cnt;
}


void sort_data() {
    static char line[LINE_SIZE];
    static char fields [2][30];

    char *input = "input.csv";

   // printf("reading the file ...........");
    FILE *fp = fopen(input, "r");
    if(fp == NULL) {
        printf("error: can't open file\n");
        exit(1);
    }

    while(fgets(line, LINE_SIZE, fp) != NULL) {
        int no_of_token = get_token(line, fields, ",");
        
        printf("no_of_token: %d\n", no_of_token);

        if(no_of_token != 2) {
            // printf(" number of fields is not 2 for entry %d",j);
            printf("no_of_token is not 2...:(\n\n");
            continue;
        }
        printf("first-elem: %s \nsecond-elem:%s\n",fields[0],fields[1]);
    }

    fclose(fp);
}

int main() {

    sort_data();

    return 0;
}
A,B
C,D
X,Y
P,Q,R
U,V

注意:如果少于或多于2个元素,也可能抛出错误…这是您的选择

首先,get_token函数始终返回0。如果要返回解析的令牌数,则需要在令牌化循环中增加flag变量。很难知道为什么程序在没有测试数据的情况下崩溃,但很可能因为“flag”从未递增,字符串从未复制到字段[1]中,而您尝试打印未初始化的内存。建议删除最终打印,以确保这是导致崩溃的代码,和/或将printf分成单独的部分,查看它是否打印字段[0],但打印字段[1]是否崩溃。
no_of_token: 2
first-elem: A
second-elem:B

no_of_token: 2
first-elem: C
second-elem:D

no_of_token: 2
first-elem: X
second-elem:Y

no_of_token: 3
no_of_token is not 2...:(

no_of_token: 2
first-elem: U
second-elem:V