2016-10-14 1 views
1

J'essaie d'obtenir un jeton d'une chaîne délimitée par un espace (""). Mais le code suivant bloque l'application lorsque la chaîne est de type char *.strtok_s plante le programme lorsque la chaîne est de type char *

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

int main(){ 

char *str1 = "Hello World!"; //char str1[] works 
char *token; 
char *savePtr; 

token = strtok_s(str1, " ", &savePtr); 

printf("%s", token); 

return 0; 
} 

Je reçois aussi les avertissements suivants:

C:\Users\Haris\Desktop\C files>gcc firstProgram.c -o firstprogram.exe 
firstProgram.c: In function 'main': 
firstProgram.c:10:9: warning: implicit declaration of function 'strtok_s' [-Wimplicit-function-declaration] 
token = strtok_s(str1, " ", &savePtr); 
     ^
firstProgram.c:10:7: warning: assignment makes pointer from integer without a cast [-Wint-conversion] 
token = strtok_s(str1, " ", &savePtr); 

Répondre

3

La fonction strtok_s modifie la chose les points de pointeur pour, tourner délimiteurs en zéros. Donc, il ne peut pas prendre un pointeur vers une constante. Mais vous le passez str1, qui est un pointeur vers une constante de chaîne. Quand il essaie de modifier cette chaîne pour transformer les délimiteurs en zéros, il essaie de modifier une constante. C'est, bien sûr, illégal.

+0

Merci. Mais alors comment puis-je utiliser strtok_s pour modifier une chaîne? Quel type devrait avoir la chaîne? –

+0

* modifier une chaîne et obtenir un jeton. Par exemple, la chaîne avec laquelle je travaille est "echo par par". Comment puis-je utiliser cette fonction pour obtenir "echo"? –

+0

Juste ne le passe pas un pointeur vers une constante. Vous pouvez le faire 'char str1 [] =" hello world ";' ou comme ceci 'char * ptr = strdup (" bonjour monde ");' ou 'char buf [80]; strcpy (buf, "bonjour monde"); '- peu importe. Ne lui passez pas un pointeur vers une constante. –