En utilisant le pointeur de caractère comme argument de strtok

Hitokiri:

J'essaie de diviser la chaîne en utilisant la strtokfonction. Mais le programme s'échouait si j'utilise le pointeur de caractère comme argument de cette fonction.

Si j'initialiser la chaîne comme s2ou s3le programme fonctionne bien. Mais si j'utiliser un pointeur vers le caractère comme s1le get du programme Segmentation fault (core dumped).

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

Le problème est que d' autres fonctions, printfet le strlentravail sans échec, mais seulement strtokobtenir erreur.

Le code complet ci-dessous:

#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;
}

Le résultat après l'exécution:

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)

strtokde la manpage:char *strtok(char *str, const char *delim);

S'il vous plaît aider à comprendre ce problème.

RSB:

Battousai , d'une part vous devez utiliser votre verso du katana pour atteindre votre objectif en utilisant la zone de lecture / écriture. Si vous ne le faites pas, à moins que le compilateur / OS ( Kamiya Kaoru ) ne vous empêche pas, Shishio Makoto peut ruiner les gars importants pour vous et autour de vous via Sojiro Seta , vivant dans la mémoire tels que Sanosuke Sagara , Yahiko Myojin .

strtok écrit dans la chaîne que vous lui donnez - en surchargeant le caractère de séparation avec nul et en gardant un pointeur sur le reste de la chaîne.

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.

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=406646&siteId=1
conseillé
Classement