English 中文(简体)
I m trying to split a string by a delimiter but it doesn t work, why?
原标题:
  • 时间:2009-11-13 02:17:20
  •  标签:
  • c
  • split
  • stdin

I wrote below code to readin line by line from stdin ex.

city=Boston;city=New York;city=Chicago

and then split each line by ; delimiter and print each record.

But for some reason the "record" pointer comes back always null. Why?

    char    del =  ; ;
    char    input[BUFLEN];

    while(fgets(input, BUFLEN, fp)) {

            input[strlen(input)-1]=  ;
            char* record = strtok(input, &del);

            while(record) {
                    printf("Record: %s
",record);
                    record = strtok(NULL, &del);
            }
}
问题回答

strtok needs a string with a nul (zero byte) at the end for its second argument. Change del to be

 char * del = ";"

Here is a full program (minus the input reading part):

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

int main ()
{
   char*    del = ";";
   char * input = strdup ("city=Boston;city=New York;city=Chicago
");
   char* record = strtok (input, del);
   while (record) {
       printf("Record: %s
",record);
       record = strtok (NULL, del);
   }
}

Try it: http://codepad.org/tzzxjOJE

There is also a strsep function which has the advantage of handling more than one string at a time.

Try char * del = ";";

The second parameter should be a null terminated string, i.e. an array of chars with a null termination.

And then pass in del to strtok.

   char*    del = ";";
   char    input[BUFLEN];

    while(fgets(input, BUFLEN, fp)) {

            input[strlen(input)-1]=  ;
            char* record = strtok(input, del);

            while(record) {
                    printf("Record: %s
",record);
                    record = strtok(NULL, del);
            }
     }

Your call to strtok() is very likely to segfault. The char * pointed to by &del does not have a NULL terminator.

strtok() expects the delimiters string to be exactly that - a null-terminated C string. You re passing it a single character, which obviously isn t a null-terminated string since a semicolon is not a null character. Instead, try this:

char del[] = ";";

I m not sure but I think because your del won t have the proper at the end.

You have to make sure the string is NULL terminated or most of the string function are gonna read the memory after your variable which could leads to LOTS of problems

something like this would be better:

    char    *del = ";";
    char    input[BUFLEN];

    while(fgets(input, BUFLEN, fp)) {

            input[strlen(input)-1]=  ;
            char* record = strtok(input, del);

            while(record) {
                    printf("Record: %s
",record);
                    record = strtok(NULL, del);
            }
}




相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签