Breaking down string and storing it in array

Adam Adamou picture Adam Adamou · Nov 8, 2011 · Viewed 31.5k times · Source

I want to break down a sentence and store each string in an array. Here is my code:

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

int main(void)
{
    int i = 0;
    char* strArray[40];
    char* writablestring= "The C Programming Language";
    char *token = strtok(writablestring, " ");


    while(token != NULL)
    {
        strcpy(strArray[i], token);
        printf("[%s]\n", token);
        token = strtok(NULL, " ");
        i++;
    }
    return 0;
}

It keeps giving me segmentation error and I cannot figure it out. I believe it has something to do when I copy the token to my array.

Answer

cnicutar picture cnicutar · Nov 8, 2011

It's because writablestring isn't writable at all. Attempting to write to a string literal is undefined behavior and strtok writes to it (that's right, strtok modifies its argument).

To make it work, try:

char writablestring[] = "The C Programming Language";

There's also a C FAQ.

Another problem is that you didn't allocate memory for your array of character pointers (so those pointers point to nothing).

char* strArray[40]; /* Array of 40 char pointers, pointing to nothing. */

Maybe try this ?

/* Careful, strdup is nonstandard. */
strArray[i] = strdup(token);

/* Or this. */
strArray[i] = malloc(strlen(token) + 1);
strcpy(strArray[i], token);