考虑strtok()在C中的实现
strtok()
char *pt; pt = strtok(line, ":"); if (pt != NULL) { pt = strtok(NULL, ":"); }
为什么pt不需要显式分配内存?比如pt[128]还是pt = malloc(...)?我本以为上面的实现会出现segfault。我是否需要担心取消分配?
pt
pt[128]
pt = malloc(...)
8ehkhllq1#
line必须引用可修改的char数组,大多数strtok实现都使用此内存。这就是为什么您不必为该操作提供任何额外内存的原因。请记住,line将在此操作期间被修改(销毁)。pt将保存(如果不是NULL)对line引用的数组中的一个元素的引用
line
char
strtok
NULL
lmyy7pcs2#
如果你有一个字符数组,例如:
char s[] = "Hello World";
然后你可以使用一个指针,它可以指向数组中的任何字符。例如这一行:
char *p = s;
这相当于:
char *p = &s[0];
指向存储在数组s中的字符串"Hello World"的第一个字符。这一行:
s
"Hello World"
p = s + 6;
设置指针p指向存储在数组s中的该字符串的子串"World"。函数strtok将传递的字符串拆分为子字符串,用零字符'\0'替换分隔符,并返回指向所选单词的指针。例如,在这个声明中:
p
"World"
pt = strtok(NULL, ":");
函数strtok仅返回指向分配给指针pt的所选子串的指针。通过类比,你可以考虑另一个函数strchr,它搜索一个指定的字符是否存在于一个字符串中,并返回第一个找到的这样一个字符的地址或NULL。
strchr
pt = strchr( line, ':' );
2条答案
按热度按时间8ehkhllq1#
line
必须引用可修改的char
数组,大多数strtok
实现都使用此内存。这就是为什么您不必为该操作提供任何额外内存的原因。
请记住,
line
将在此操作期间被修改(销毁)。pt
将保存(如果不是NULL
)对line
引用的数组中的一个元素的引用lmyy7pcs2#
如果你有一个字符数组,例如:
然后你可以使用一个指针,它可以指向数组中的任何字符。例如这一行:
这相当于:
指向存储在数组
s
中的字符串"Hello World"
的第一个字符。这一行:
设置指针
p
指向存储在数组s
中的该字符串的子串"World"
。函数
strtok
将传递的字符串拆分为子字符串,用零字符'\0'替换分隔符,并返回指向所选单词的指针。例如,在这个声明中:
函数
strtok
仅返回指向分配给指针pt
的所选子串的指针。通过类比,你可以考虑另一个函数
strchr
,它搜索一个指定的字符是否存在于一个字符串中,并返回第一个找到的这样一个字符的地址或NULL。