打印delrt由strtok_r使用

时间:2014-11-22 18:21:49

标签: c strtok

我有这样的文字例如:

I know,, more.- today, than yesterday!

我用这段代码提取单词:

while(getline(&line, &len, fpSourceFile) > 0) {
  last_word = NULL;
  word = strtok_r(line, delim, &last_word);

  while(word){
    printf("%s ", word);
    word = strtok_r(NULL, delim, &last_word);
    // delim_used = ;
  }
}

输出结果为:

I know more today than yesterday

但有没有办法让strtok_r()使用分隔符?我想用一个整数替换相同的单词,并对分隔符执行相同的操作。我可以用strtok_r()获得一个单词,但是如何获得该函数使用的分隔符?

2 个答案:

答案 0 :(得分:1)

幸运的是,strtok_r()是一个非常简单的功能 - 您可以轻松创建自己的变体,满足您的需求:

#include <string.h>

/* 
 * public domain strtok_ex() based on a public domain 
 *      strtok_r() by Charlie Gordon
 *
 *   strtok_r from comp.lang.c  9/14/2007
 *
 *      http://groups.google.com/group/comp.lang.c/msg/2ab1ecbb86646684
 *
 *     (Declaration that it's public domain):
 *      http://groups.google.com/group/comp.lang.c/msg/7c7b39328fefab9c
 */

 /*
    strtok_ex() is an extended version of strtok_r() that optinally 
    returns the delimited that was used to terminate the token

    the first 3 parameters are the same as for strtok_r(), the last
    parameter:

        char* delim_found

    is an optional pointer to a character that will get the value of
    the delimiter that was found to terminate the token.

 */
char* strtok_ex(
    char *str, 
    const char *delim, 
    char **nextp,
    char* delim_found)
{
    char *ret;
    char tmp;

    if (!delim_found) delim_found = &tmp;

    if (str == NULL)
    {
        str = *nextp;
    }

    str += strspn(str, delim);

    if (*str == '\0')
    {
        *delim_found = '\0';
        return NULL;
    }

    ret = str;

    str += strcspn(str, delim);

    *delim_found = *str;
    if (*str)
    {
        *str++ = '\0';
    }

    *nextp = str;

    return ret;
}


#include <stdio.h>
int main(void)
{
    char delim[] = " ,.-!";
    char line[] = "I know,, more.- today, than yesterday!";

    char delim_used;    
    char* last_word = NULL;
    char* word = strtok_ex(line, delim, &last_word, &delim_used);

    while (word) {
        printf("word: \"%s\" \tdelim: \'%c\'\n", word, delim_used);
        word = strtok_ex(NULL, delim, &last_word, &delim_used);
    }

    return 0;
}

获取任何跳过的分隔符将会更加有效。我不认为这会有很多工作,但我确实认为界面不实用(strtok_ex()的界面已经笨重了),所以你必须考虑一下。

答案 1 :(得分:0)

不,你无法识别分隔符(通过调用strtok_r()本身)。

来自man strtok_r

  

<强> BUGS

     

[...]

     
      
  • 分隔字节的标识丢失。
  •