strtokの引数として文字へのポインタを使用します

Hitokiri :

私が使用して文字列を分割しようとstrtok機能を。しかし、このプログラムは、私は、この関数の引数として文字へのポインタを使用する場合は失敗となります。

私は、文字列を初期化した場合s2s3プログラムがうまく動作します。しかし、私は、文字へのポインタを使用する場合はs1、プログラム取得Segmentation fault (core dumped)

char *s1 = "1A 2B 3C 4D";
char s2[] = "1A 2B 3C 4D";
char s3[20] = "1A 2B 3C 4D";

問題は、他の機能であり、printfそしてstrlen失敗せずに作業が、唯一のstrtokエラーを取得します。

完全なコード以下:

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

void split_string(char *s) {
    char * token = strtok(s," ");
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, " ");
    }
}

int main()
{
    char *s1 = "1A 2B 3C 4D";
    char s2[] = "1A 2B 3C 4D";
    char s3[20] = "1A 2B 3C 4D";
    printf("size of s1 = %ld, s2 = %ld, s3 = %ld\n", strlen(s1), strlen(s2), strlen(s3));
    printf("s1: %s\ns2: %s\ns3: %s\n",s1,s2,s3);
    printf("split s2: \n");
    split_string(s2);
    printf("split s3: \n");
    split_string(s3);
    printf("split s1: \n");
    split_string(s1);
    return 0;
}

ランニング後の結果:

size of s1 = 11, s2 = 11, s3 = 11
s1: 1A 2B 3C 4D
s2: 1A 2B 3C 4D
s3: 1A 2B 3C 4D
split s2: 
1A
2B
3C
4D
split s3: 
1A
2B
3C
4D
split s1: 
Segmentation fault (core dumped)

strtok以下からのmanページ:char *strtok(char *str, const char *delim);

この問題を理解するのに役立ちます。

SNR:

Battousaiは、まずあなたは、読み出し/書き込み可能な領域を用いて、あなたの目的を達成するために刀のあなたの裏面を使用する必要があります。これを行わないと、コンパイラ/ OS(ない限り、神谷薫は)できないわけではありません、志々雄真実を介して、あなたのための重要なみんなを台無しにし、あなたの周りにも宗次郎瀬田のような、あなたの記憶に住んで、左之助相良弥彦明神

strtok ヌルで区切り文字を上書きし、残りの文字列へのポインタを維持する - あなたはそれを与える文字列に書き込みます。

char *s1 = "1A 2B 3C 4D"; // you have a pointer to some read-only characters
char s2[] = "1A 2B 3C 4D"; // same, decay into pointer
char s3[20] = "1A 2B 3C 4D"; // a twenty element array of characters that you can do what you like with.

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=406645&siteId=1