El uso de puntero a caracteres como argumento de strtok

hitokiri:

Trato de dividir la cadena mediante el uso de strtokla función. Pero el programa se convierta fallado si uso el puntero al carácter como el argumento de esta función.

Si puedo inicializar la cadena como s2o s3el programa funciona bien. Pero si yo uso puntero al carácter como s1el programa get Segmentation fault (core dumped).

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

El problema es que las otras funciones, printfy strlenel trabajo sin fallo, pero sólo strtoksale error.

El código completo a continuación:

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

El resultado después de ejecutar:

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)

strtokdesde manla página:char *strtok(char *str, const char *delim);

Por favor, ayuda a entender este problema.

SNR:

Battousai , en primer lugar, es necesario utilizar el reverso de la katana para lograr su objetivo mediante el uso de área de lectura / escritura. Si no lo hace, a menos que el compilador / OS ( Kaoru Kamiya ) no impide que, Shishio Makoto puede arruinar chicos importantes para usted y alrededor de usted a través de Sojiro Seta , que vive en su memoria, tal como Sanosuke Sagara , Yahiko Myojin .

strtok escribe en la cadena que le des - sobrescribir el carácter separador con nula y mantener un puntero al resto de la cadena.

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.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=406648&siteId=1
Recomendado
Clasificación