Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 分隔符为字符串时的strtok()_C_Strtok - Fatal编程技术网

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