【问题标题】:want to separate string in to tokens using specific character想要使用特定字符将字符串分隔为标记
【发布时间】:2012-07-10 17:08:23
【问题描述】:

这里我有一个字符串表示字符数组。该数组还包含分隔符。现在我只想取出没有这个分隔符的字符串。

我正在使用strtok 函数。

我想用这个分隔符分隔我所有的单词。

但是我在这段代码中遇到了一些问题。

如果我做错了什么,请告诉我,或者告诉我不同​​的简单方法来实现这件事,还要考虑内存风险。

这行pch = strtok (str,&sep); 什么也得不到。问题只在这里。

代码

/* strtok example */
#include <stdio.h>
#include <string.h>

#define SEPRATOR 0x03

int main ()
{
    char str[1024];
    int count = 0;
    char sep;
    memset(str,0,1024);
    sep = SEPRATOR;

    memcpy(str,"1",strlen("1"));
    count = count + strlen("1");
    str[count++] = sep;
    memcpy(str+count,"0",strlen("0"));
    count = count + strlen("0");
    str[count++] = sep;
    memcpy(str+count,"2",strlen("2"));
    count = count + strlen("2");
    str[count++] = sep;
    memcpy(str+count,"abc_1.0.xyz",strlen("abc_1.0.xyz"));
    count = count + strlen("abc_1.0.xyz");
    str[count++] = sep;
    memcpy(str+count,"3",strlen("3"));
    count = count + strlen("3");
    str[count++] = sep;
    memcpy(str+count,"23455.456",strlen("23455.456"));
    count = count + strlen("23455.456");

    printf("Input String = %s\n",str);

    char * pch;
    int pchcount = 0;
    pch = strtok (str,&sep);
    while (pch != NULL)
    {
        pchcount++;
        printf ("%d === %s\n",pchcount,pch);
        pch = strtok (NULL,&sep);
    }
    return 0;
}

【问题讨论】:

  • @chris 您建议的问题是针对c++。这个问题被标记为c。但是,这个问题可能与Tokenizing strings in c 重复。
  • @EitanT,我的错,当我去寻找常见问题解答时,它被标记为 C++。

标签: c strtok


【解决方案1】:

strtok() 的第二个参数是一个以空字符结尾的字符串 (char*),但您传递的是单个 char 的地址。虽然是char*,但它不会以空值终止。改为:

char sep[2] = { SEPRATOR, 0 };

相应地更改sep 的当前用途:

str[count++] = sep[0];

pch = strtok(str, sep);

您可能会发现snprintf() 的构造strmemcpy() 调用序列更简单。

另外,如果你想初始化str:

char str[1024] = ""; /* instead of performing a memset(). */

【讨论】:

  • 那么我该怎么做呢?解决办法是什么
  • 感谢您的回复。有必要释放我在代码中使用的 pch 指针吗?因为我还必须处理内存问题。
  • @hmjd 你能解释一下为什么我们不需要释放 pch 指针。因为我也对此感到困惑。提前致谢
  • @user1089679, strtok() 遍历传递给它的缓冲区。 strtok() 的返回值指的是该缓冲区内的不同位置,它不执行 malloc()
猜你喜欢
  • 2016-08-03
  • 2020-05-31
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
相关资源
最近更新 更多