这里我有一个字符串表示字符数组.此数组也包含分隔符.现在我想只取出没有这个分隔符的字符串.
我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
第二个参数strtok()是一个以null结尾的字符串(char*),但是你传递了一个地址char.虽然a char*,它不会被null终止.改成:
char sep[2] = { SEPRATOR, 0 };
Run Code Online (Sandbox Code Playgroud)
相应地改变当前的用途sep:
str[count++] = sep[0];
pch = strtok(str, sep);
Run Code Online (Sandbox Code Playgroud)
您可能会发现snprintf()构建您的str比memcpy()调用序列更简单.
另外,如果要初始化str:
char str[1024] = ""; /* instead of performing a memset(). */
Run Code Online (Sandbox Code Playgroud)