Ai-je besoin pour libérer de la strtok chaîne résultante?
Ou plutôt, comment ne strtok produire de la chaîne à laquelle il est de retour de la valeur des points? Est-il allouer de la mémoire dynamiquement? Je demande car je ne suis pas sûr si j'ai besoin de libérer le jeton dans le code suivant:
La STANDARD_INPUT variables est pour quitter la procédure dans le cas où je n'ai plus de mémoire pour l'allocation et la chaîne est testé sujet.
int ValidTotal(STANDARD_INPUT, char *str)
{
char *cutout = NULL, *temp, delim = '#';
int i = 0; //Checks the number of ladders in a string, 3 is the required number
temp = (char*)calloc(strlen(str),sizeof(char));
if(NULL == temp)
Pexit(STANDARD_C); //Exit function, frees the memory given in STANDARD_INPUT(STANDARD_C is defined as the names given in STANDARD_INPUT)
strcpy(temp,str);//Do not want to touch the actual string, so copying it
cutout = strtok(temp,&delim);//Here is the lynchpin -
while(NULL != cutout)
{
if(cutout[strlen(cutout) - 1] == '_')
cutout[strlen(cutout) - 1] = 'int ValidTotal(STANDARD_INPUT, char *str)
{
char *cutout = NULL, *temp, delim = '#';
int i = 0; //Checks the number of ladders in a string, 3 is the required number
temp = (char*)calloc(strlen(str),sizeof(char));
if(NULL == temp)
Pexit(STANDARD_C); //Exit function, frees the memory given in STANDARD_INPUT(STANDARD_C is defined as the names given in STANDARD_INPUT)
strcpy(temp,str);//Do not want to touch the actual string, so copying it
cutout = strtok(temp,&delim);//Here is the lynchpin -
while(NULL != cutout)
{
if(cutout[strlen(cutout) - 1] == '_')
cutout[strlen(cutout) - 1] = '\0'; \\cutout the _ at the end of a token
if(Valid(cutout,i++) == INVALID) //Checks validity for substring, INVALID is -1
return INVALID;
cutout = strtok(NULL,&delim);
strcpy(cutout,cutout + 1); //cutout the _ at the beginning of a token
}
free(temp);
return VALID; //VALID is 1
}
'; \\cutout the _ at the end of a token
if(Valid(cutout,i++) == INVALID) //Checks validity for substring, INVALID is -1
return INVALID;
cutout = strtok(NULL,&delim);
strcpy(cutout,cutout + 1); //cutout the _ at the beginning of a token
}
free(temp);
return VALID; //VALID is 1
}
Ne pas, ne pas besoin, car il renvoie l'adresse de la partie de la
temp
En termes de code à strtok. temp libéré par free(temp)
OriginalL'auteur Sunspawn | 2014-01-03
Vous devez vous connecter pour publier un commentaire.
strtok manipule la chaîne que vous transmettez et renvoie un pointeur vers elle,
donc pas de la mémoire est allouée.
Veuillez utiliser strsep ou au moins strtok_r de vous faire économiser des maux de tête plus tard.
strtok n'est pas réentrant
OriginalL'auteur Andreas
Selon la docs:
Depuis le retour du pointeur juste des points à l'un des octets dans votre chaîne d'entrée où le jeton commence, si vous avez besoin de libérer dépend si vous avez attribué la chaîne d'entrée ou pas.
OriginalL'auteur qwwqwwq
Le premier paramètre à la strtok(...) la fonction est VOTRE chaîne:
Il met les caractères '\0' dans VOTRE chaîne de caractères et renvoie comme des chaînes terminées. Oui, il mangles votre chaîne d'origine. Si vous en avez besoin plus tard, en faire une copie.
De plus, il ne devrait pas être une chaîne constante (par exemple
char* myStr = "constant string";).
Voir ici.Il pourrait être attribuée localement ou par malloc/calloc.
Si vous avez alloué à l'échelle locale sur la pile (par exemple
char myStr[100];
), vous n'avez pas à le libérer.Si vous avez alloué par malloc (par exemple
char* myStr = malloc(100*sizeof(char));
), vous devez libérer de l'.Un exemple de code:
REMARQUE: Cet exemple montre comment vous parcourez la chaîne...depuis votre chaîne d'origine a été mutilé, strtok(...) se souvient de l'endroit où vous étiez la dernière fois et continue à travailler par le biais de la chaîne.
OriginalL'auteur FuzzyBunnySlippers