从字符串中获取标记并更改字符串

时间:2018-05-04 19:58:56

标签: c string

我想将一个字符串分成较小的字符串并沿途更改输入字符串。

所以例如 - >输入:您好我的名字是

我想获得第一个标记(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函数中进行更改

1 个答案:

答案 0 :(得分:1)

这是一个有趣的请求:在没有分配或静态的情况下将字符串分解为标记。

这是一种方法:

  • 您可以扫描参数字符串以确定要返回的子字符串以及参数字符串的新起点。
  • 如果没有新令牌,则返回NULL
  • 将令牌复制到临时内存块
  • 移动字符串的内容,以便在开始时显示新的开头。
  • 在字符串新结束后复制保存的标记
  • 返回一个指针。
  • 一个警告:除了null终止符之外,源字符串必须至少有一个额外的字节可用。

由于字节重排,它不如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;
}