Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Breaking down string and storing it in array

Tags:

c

strtok

cstring

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.

like image 340
Adam Adamou Avatar asked Nov 08 '11 19:11

Adam Adamou


2 Answers

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);
like image 123
cnicutar Avatar answered Oct 11 '22 23:10

cnicutar


Have a look at the example in the docs:

char * strtok ( char * str, const char * delimiters );

...where...

str - C string to truncate. The contents of this string are modified and broken into smaller strings (tokens). Alternativelly, a null pointer may be specified, in which case the function continues scanning where a previous successful call to the function ended.

delimiters - C string containing the delimiters. These may vary from one call to another.

Return Value - A pointer to the last token found in string. A null pointer is returned if there are no tokens left to retrieve.

You need that first string to me modifiable and you need to allocate memory for the outputs e.g.

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

    for( int j = 0; j < numOfStrings; j++ )
    {
        strArray[j] = new char[40];
    }

    while(token != NULL)
    {
        strcpy(strArray[i], token);
        printf("[%s]\n", token);
        token = strtok(NULL, " ");
        i++;
    }
    return 0;
}
like image 36
Jon Cage Avatar answered Oct 11 '22 22:10

Jon Cage