C 分隔符为字符串时的strtok()
当分隔符是字符串时,我想使用C 分隔符为字符串时的strtok(),c,strtok,C,Strtok,当分隔符是字符串时,我想使用strtok(),如 “断点” i、 e 成为: 这是第一部分。 这是第二部分 问题是当我包含空格时,它也由每个空格实现 以下是相关代码: char seps[5] = " $$$ "; char *token; char current[500] = {0}; int i=0; while(fgets(current, 500, relevantFile) != NULL){ printf("number %d:\n", i+1); token = st
strtok()
,如
“断点”
i、 e 成为:
这是第一部分。
这是第二部分
char seps[5] = " $$$ ";
char *token;
char current[500] = {0};
int i=0;
while(fgets(current, 500, relevantFile) != NULL){
printf("number %d:\n", i+1);
token = strtok(current, seps);
while(token != NULL){
printf(token);
printf("\n");
token = strtok(NULL, seps);
}
printf("\n");
i++;
}
当前值为“爱因斯坦,1900$$$莫扎特,1700”控制台中的预期答案是:
number 1:
Einstein, 1900
number 2:
Mozart, 1700
但它打印的是:
number 1:
Einstein,
1900
number 2:
Mozart,
1700
要删除子字符串,您可能需要尝试使用strstr()执行某些操作。找到要删除的子字符串,然后在该子字符串上放置一个空终止符“\0”,并在其上放置已删除子字符串后的余数 例如:
#包括
#包括
void removeSubstr(char*string,char*sub){
字符*匹配;
int len=strlen(sub);
while((match=strstr(string,sub))){
*匹配='\0';
strcat(字符串,匹配+len);
}
}
int main(int argc,const char*argv[]{
char test[]=“好的/op1234/opdone”;
移除Substr(测试,“/op”);
放置(测试);
返回0;
}
编辑:
代码中的seps字符串应该是“$$$”而不是“$$”。这将解决您的问题。该函数可以按照演示程序中显示的方式查看
#include <stdio.h>
#include <string.h>
char * split_string( char *s, const char *delimiter )
{
static char *p;
if ( s ) p = s;
size_t n = strlen( delimiter );
if ( p && n != 0 )
{
while ( memcmp( p, delimiter, n ) == 0 ) p += n;
}
if ( !p || !*p ) return p = NULL;
char *t = p;
if ( n != 0 ) p = strstr( t, delimiter );
if ( n == 0 || !p )
{
p = t + strlen( t );
}
else
{
*p = '\0';
p += n;
}
return t;
}
int main( void )
{
char s1[] = "This is the first part. break point This is the second part";
char t1[] = " break point ";
char *p = split_string( s1, t1 );
while ( p )
{
puts( p );
p = split_string( NULL, t1 );
}
char s2[] = "Einstein, 1900 $$$ Mozart, 1700";
char t2[] = " $$$ ";
p = split_string( s2, t2 );
while ( p )
{
puts( p );
p = split_string( NULL, t2 );
}
return 0;
}
我不想删除子字符串,但要使用指定的分隔符拆分字符串,您的seps字符串有空格。它应该是“$$$”而不是“$$$”。这是关键!我希望这些空间成为delimiter@TzahiLeh是否适合您?在visual studio上,“$$$”前后的空间仍然保留。。输出与strtok(当前,$$)相同代码>@TzahiLeh你错了。该函数跳过带有嵌入空格的字符串“$$$”。这就是我运行代码时得到的结果:\@TzahiLeh我的代码是正确的。我不知道你在干什么。我不知道,但我得到了他的帮助
#include <stdio.h>
#include <string.h>
void removeSubstr (char *string, char *sub) {
char *match;
int len = strlen(sub);
while ((match = strstr(string, sub))) {
*match = '\0';
strcat(string, match+len);
}
}
int main(int argc, const char *argv[]) {
char test[] = "okay/op 1234 /opdone";
removeSubstr(test, "/op");
puts(test);
return 0;
}
#include <stdio.h>
#include <string.h>
char * split_string( char *s, const char *delimiter )
{
static char *p;
if ( s ) p = s;
size_t n = strlen( delimiter );
if ( p && n != 0 )
{
while ( memcmp( p, delimiter, n ) == 0 ) p += n;
}
if ( !p || !*p ) return p = NULL;
char *t = p;
if ( n != 0 ) p = strstr( t, delimiter );
if ( n == 0 || !p )
{
p = t + strlen( t );
}
else
{
*p = '\0';
p += n;
}
return t;
}
int main( void )
{
char s1[] = "This is the first part. break point This is the second part";
char t1[] = " break point ";
char *p = split_string( s1, t1 );
while ( p )
{
puts( p );
p = split_string( NULL, t1 );
}
char s2[] = "Einstein, 1900 $$$ Mozart, 1700";
char t2[] = " $$$ ";
p = split_string( s2, t2 );
while ( p )
{
puts( p );
p = split_string( NULL, t2 );
}
return 0;
}
This is the first part.
This is the second part
Einstein, 1900
Mozart, 1700