核心转储分段错误
core dumped segmentation fault
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
typedef struct student{
char name[25];
float marks;
}student_t;
int size = 0;
int capacity = 2;
char filename[30];
#define LINE_SIZE 128
void print(student_t **arr){
for (int i = 0; i < size; i++){
printf("%d: %s, %f\n", i+1, arr[i]->name, arr[i]->marks);
}
}
int create_table_entry(student_t **arr, int *size, int *capacity){
//printf("%d",size);
if( *size == *capacity) {
*capacity = *capacity * 2;
*arr = realloc (*arr, *capacity * sizeof(student_t));
}
return 0;
}
void add_record(student_t **arr, char *name, char *marks){
create_table_entry(arr,&size ,&capacity);
strcpy(arr[size]->name, name);
arr[size]->marks = atof(marks);
size++;
//print(arr);
}
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;
}
static void sort_data(){
// printf("reading the file ...........");
FILE *fileOpen = fopen( filename , "r");
if (fileOpen == NULL){
fprintf(stderr, "Error in opening input file. Filename = %s, Error = %s\n", filename, strerror(errno));
exit (-1);
}
char line[LINE_SIZE];
char fields [2][30];
student_t *arr;
arr = malloc(capacity * sizeof(student_t));
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;
}
add_record(&arr,fields[0],fields[1]);
//printf("%s \n %s",fields[0],fields[1]);
}
print(&arr);
free(arr);
}
void check_argument(int argc,char *argv[]){
int count =0;
for(int i=1; i<argc; i++){
if(strstr("-f",argv[i])){
sprintf(filename,"%s",argv[i+1]);
count++;
}
}
if(count>1||count<1){
printf("invalid format");
}
//printf("%s\n",filename);
}
int main(int argc, char *argv[]){
check_argument(argc, argv);
sort_data();
return 0;
}
在上面的程序中,我想要做的是打开一个 (.csv) 文件,逐行读取它,然后将这些行传递给 get_token 函数,这样就可以生成令牌,我只想要那些有 2 个字段的行我也想获取这 2 个标记的值,以便我可以将它传递给 add_record 函数并创建一个动态结构数组,以便我可以对其进行排序并将其存储在其他文件中。但是当我 运行 它显示核心转储时,我没有得到文件中学生记录的值,而是我的输出。所以请帮助我解决这个问题,因为我是 c.And 中的编程新手,如果我的代码伤害了你的眼睛,也很抱歉
这部分
void print(student_t **arr){
for (int i = 0; i < size; i++){
printf("%d: %s, %f\n", i+1, arr[i]->name, arr[i]->marks);
}
}
有问题。您传递了一个 pointer-to-pointer-to-student_t,因此当您建立索引时,它预计它是一个 pointer-to-student_t 的数组。但是你实际上有一个 student_t.
的数组
尝试:
void print(student_t *arr){
for (int i = 0; i < size; i++){
printf("%d: %s, %f\n", i+1, arr[i].name, arr[i].marks);
}
}
并这样称呼它:print(arr);
编辑:正如@kaylum 在评论中指出的那样,您在这里遇到了同样的问题:
strcpy(arr[size]->name, name);
arr[size]->marks = atof(marks);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
typedef struct student{
char name[25];
float marks;
}student_t;
int size = 0;
int capacity = 2;
char filename[30];
#define LINE_SIZE 128
void print(student_t **arr){
for (int i = 0; i < size; i++){
printf("%d: %s, %f\n", i+1, arr[i]->name, arr[i]->marks);
}
}
int create_table_entry(student_t **arr, int *size, int *capacity){
//printf("%d",size);
if( *size == *capacity) {
*capacity = *capacity * 2;
*arr = realloc (*arr, *capacity * sizeof(student_t));
}
return 0;
}
void add_record(student_t **arr, char *name, char *marks){
create_table_entry(arr,&size ,&capacity);
strcpy(arr[size]->name, name);
arr[size]->marks = atof(marks);
size++;
//print(arr);
}
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;
}
static void sort_data(){
// printf("reading the file ...........");
FILE *fileOpen = fopen( filename , "r");
if (fileOpen == NULL){
fprintf(stderr, "Error in opening input file. Filename = %s, Error = %s\n", filename, strerror(errno));
exit (-1);
}
char line[LINE_SIZE];
char fields [2][30];
student_t *arr;
arr = malloc(capacity * sizeof(student_t));
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;
}
add_record(&arr,fields[0],fields[1]);
//printf("%s \n %s",fields[0],fields[1]);
}
print(&arr);
free(arr);
}
void check_argument(int argc,char *argv[]){
int count =0;
for(int i=1; i<argc; i++){
if(strstr("-f",argv[i])){
sprintf(filename,"%s",argv[i+1]);
count++;
}
}
if(count>1||count<1){
printf("invalid format");
}
//printf("%s\n",filename);
}
int main(int argc, char *argv[]){
check_argument(argc, argv);
sort_data();
return 0;
}
在上面的程序中,我想要做的是打开一个 (.csv) 文件,逐行读取它,然后将这些行传递给 get_token 函数,这样就可以生成令牌,我只想要那些有 2 个字段的行我也想获取这 2 个标记的值,以便我可以将它传递给 add_record 函数并创建一个动态结构数组,以便我可以对其进行排序并将其存储在其他文件中。但是当我 运行 它显示核心转储时,我没有得到文件中学生记录的值,而是我的输出。所以请帮助我解决这个问题,因为我是 c.And 中的编程新手,如果我的代码伤害了你的眼睛,也很抱歉
这部分
void print(student_t **arr){
for (int i = 0; i < size; i++){
printf("%d: %s, %f\n", i+1, arr[i]->name, arr[i]->marks);
}
}
有问题。您传递了一个 pointer-to-pointer-to-student_t,因此当您建立索引时,它预计它是一个 pointer-to-student_t 的数组。但是你实际上有一个 student_t.
的数组尝试:
void print(student_t *arr){
for (int i = 0; i < size; i++){
printf("%d: %s, %f\n", i+1, arr[i].name, arr[i].marks);
}
}
并这样称呼它:print(arr);
编辑:正如@kaylum 在评论中指出的那样,您在这里遇到了同样的问题:
strcpy(arr[size]->name, name);
arr[size]->marks = atof(marks);