或者更确切地说,strtok如何生成返回值指向的字符串?它是否动态分配内存?我问,因为我不确定是否需要在以下代码中释放令牌:
STANDARD_INPUT变量用于退出程序,以防我内存耗尽以进行分配,字符串是测试对象。</ p>
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
}
答案 0 :(得分:8)
strtok 操纵传入的字符串并返回指向它的指针, 所以没有分配内存。
请考虑使用 strsep 或至少 strtok_r 以避免让您感到头疼。
答案 1 :(得分:5)
答案 2 :(得分:3)
strtok(...)函数的第一个参数是你的字符串:
STR
C字符串要截断。请注意,此字符串已被修改 被分成更小的字符串(代币)。可选地,null 可以指定指针,在这种情况下,函数继续 扫描先前成功调用函数的位置。
它将'\ 0'字符放入您的字符串并将它们作为终止字符串返回。 是的,它会破坏原始字符串。如果您以后需要,请复制。
此外,不应该是常量字符串(例如char* myStr = "constant string";).
请参阅here。
可以在本地或通过malloc / calloc分配。
如果您在堆栈中本地分配它(例如char myStr[100];
),则不必释放它。
如果您通过malloc(例如char* myStr = malloc(100*sizeof(char));
)分配它,则需要释放它。
一些示例代码:
#include <string.h>
#include <stdio.h>
int main()
{
const char str[80] = "This is an example string.";
const char s[2] = " ";
char *token;
/* get the first token */
token = strtok(str, s);
/* walk through other tokens */
while( token != NULL )
{
printf( " %s\n", token );
token = strtok(NULL, s);
}
return(0);
}
注意:此示例显示了如何遍历字符串...因为您的原始字符串被破坏了,strtok(...)会记住您上次的位置并继续处理字符串。