当前位置:  开发笔记 > 前端 > 正文

在C中对字符串进行标记

如何解决《在C中对字符串进行标记》经验,为你挑选了3个好方法。

我一直试图使用SPACE作为分隔符来标记字符串,但它不起作用.有没有人建议为什么它不起作用?

编辑:使用以下方式标记:

strtok(string, " ");

代码如下

pch = strtok (str," ");
while (pch != NULL)
{
  printf ("%s\n",pch);
  pch = strtok (NULL, " ");
}

gbjbaanb.. 42

像这样做:

char s[256];
strcpy(s, "one two three");
char* token = strtok(s, " ");
while (token) {
    printf("token: %s\n", token);
    token = strtok(NULL, " ");
}

注意:strtok修改字符串的标记,所以它不能是一个const char*.



1> gbjbaanb..:

像这样做:

char s[256];
strcpy(s, "one two three");
char* token = strtok(s, " ");
while (token) {
    printf("token: %s\n", token);
    token = strtok(NULL, " ");
}

注意:strtok修改字符串的标记,所以它不能是一个const char*.


我会回报的;)

2> Evan Teran..:

这里有一个例子strtok使用,请记住,strtok是破坏性的,它的输入字符串(因此不能永远被一个字符串常量使用

char *p = strtok(str, " ");
while(p != NULL) {
    printf("%s\n", p);
    p = strtok(NULL, " ");
}

基本上需要注意的是,传递一个NULL作为第一个参数来strtok告诉它从之前标记的字符串中获取下一个标记.


`strtok`有一个内部状态变量,跟踪被标记化的字符串.当你传递`NULL`时,`strtok`将继续使用这个状态变量.传递非null值时,将重置状态变量.换句话说:传递"NULL"意味着"继续标记相同的字符串".
谢谢你的澄清.但无论如何它似乎是一个可怕的设计.
`strtok()`怎么知道,什么时候从字符串中获取下一个令牌,它先前是标记化的?对我来说,看起来`strtok()`应该标记'NULL`值.我期待一个错误.

3> Kieveli..:

strtok可能非常危险.它不是线程安全的.它的预期用途是在循环中反复调用,传入前一次调用的输出.strtok函数有一个内部变量,用于存储strtok调用的状态.这种状态并非每个线程都是唯一的 - 它是全局的.如果任何其他代码在另一个线程中使用strtok,则会出现问题.不是你要追查的那种问题!

我建议寻找正则表达式实现,或使用sscanf来拉开字符串.

试试这个:

char strprint[256];
char text[256];
strcpy(text, "My string to test");
while ( sscanf( text, "%s %s", strprint, text) > 0 ) {
   printf("token: %s\n", strprint);
}

注意:'text'字符串在分离时被销毁.这可能不是首选的行为=)


事实上,如果你看一下现代strtok实现,他们倾向于使用线程本地存储(MSVC肯定已经做了多年和多年),所以它们是线程安全的.它仍然是一个古老的功能,我会避免,但...
strtok_r是strtok的线程安全版本http://pubs.opengroup.org/onlinepubs/009695399/functions/strtok.html
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有