简体   繁体   中英

Buffer to array (segmentation fault)

I'm trying to open a file, read the content line by line (excluding the empty lines) and store all these lines in an array, but seems I cannot come to the solution.

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

int main()
{

char buffer[500];
FILE *fp;
int lineno = 0;
int n;
char topics[lineno];

if ((fp = fopen("abc.txt","r")) == NULL){
printf("Could not open abc.txt\n");
return(1);
}

while (!feof(fp))
{
// read in the line and make sure it was successful
if (fgets(buffer,500,fp) != NULL){
    if(buffer[0] == '\n'){
    }
    else{
    strncpy(topics[lineno],buffer, 50);
    printf("%d: %s",lineno, topics[lineno]);
    lineno++;
    printf("%d: %s",lineno, buffer);
    }
}
}
return(0);
}

Considering "abc.txt" contains four lines (the third one is empty) like the following:
ab
2

4

I have been trying several ways but all I'm getting now is segmentation fault.

It is mostly because you are trying to store the read line in a 0 length array

int lineno = 0;
int n;
char topics[lineno];    //lineno is 0 here

There are more mistakes in your program after you correct the above mentioned one.

strncpy() needs a char* as its first parameter, and you are passing it a char .


If you want to store all the lines, in a manner such that array[0] is the first line, array[1] is the next one, then you would need an `array of char pointers.

Something like this

char* topics[100];
.
.
.
if (fgets(buffer,500,fp) != NULL){
    if(buffer[0] == '\n'){
    }
    else{
        topics[lineno] = malloc(128);
        strncpy(topics[lineno],buffer, 50);
        printf("%d: %s",lineno, topics[lineno]);
        lineno++;
        printf("%d: %s",lineno, buffer);
    }

NOTE: Use the standard definition of main()

int main(void) //if no command line arguments.

Bonus

Since you have accidentally stepped onto 0 length array , do read about it here .

This declaration of a variable length array

int lineno = 0;
char topics[lineno];

is invalid because the size of the array may not be equal to 0 and does not make sense in the context of the program/

You could dynamically allocate an array of pojnters to char that is of type char * and reallocate it each time when a new record is added.

For example

int lineno = 0;
int n;
char **topics = NULL;

//...

char **tmp = realloc( topics, ( lineno + 1 ) * sizeof( char * ) );
if ( tmp != NULL )
{
    topics = tmp;
    topics[lineno] = malloc( 50 * sizeof( char ) );
    //... copy the string and so on
    ++lineno;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM