我想将一个字符串分成较小的字符串并沿途更改输入字符串。
所以例如 - >输入:您好我的名字是
我想获得第一个标记(Hi),从函数返回它,并在同一个函数内部将我的字符串更改为:my name is
然后,下一次迭代该函数返回" my"并且字符串变为"名称是"
类似的东西:
char * tokeniz(char * str){
char * token;
token = strtok(str," ");
/* eliminate the token from the input string */
return token;
}
main(){
char *tok;
char *s=malloc(sizeof(char)*100);
fgets (s, 100, stdin);
loop {
tok=tokeniz(s);
func_do_something_with_tok();
}
}
注意输入字符串' s'必须在返回下一次迭代时在main函数中进行更改
答案 0 :(得分:1)
这是一个有趣的请求:在没有分配或静态的情况下将字符串分解为标记。
这是一种方法:
由于字节重排,它不如strtok_r
有效。
这是一个实现:
#include <string.h>
char *tokeniz(char *str) {
size_t n1 = strspn(str, " \f\t\r\n");
size_t n2 = strcspn(str + n1, " \f\t\r\n");
size_t n3 = strlen(str + n1 + n2) + 1;
if (n2 == 0)
return NULL;
char token[n2];
memcpy(token, str + n1, n2);
memmove(str, str + n1 + n2, n3);
char *res = str + n3;
memcpy(res, token, n2);
res[n2] = '\0';
return res;
}