【问题标题】:splitting a variable number of tokens with strtok_r用 strtok_r 拆分可变数量的令牌
【发布时间】:2010-11-30 12:44:54
【问题描述】:

我通过命名管道接收这种格式的命令:

GETIP <machine_name> \n
<process_id>

GETNAME<ip_address> \n
<process_id>

UDATA <machine_name> <ip_address>
<process_id>

DDATA <machine_name> \n
<process_id>

因此,从管道中读取的示例字符串是:

GETIP lolcatzmachine
1235

UDATA cheezburger 127.0.0.1
7564

说实话,我不知道我到底在做什么,我不熟悉 c 标记。如何更改我的代码以满足要求?

char *token; 

char *commandName [10];
char machineName[200];
char ip[40];
char pid[30];

char * separator = "  "; 
char *brkt; // reentrant pointer, as this tokenizing will be multithreaded

for ( ; ; ) {

 token=strtok_r(command_and_pid, separator, &brkt); //strtok_r is needed for multithreading

 commandName = strdup(token);

    //ip=strtok_r(NULL, separator, &brkt);

   //pid=strtok_r(NULL, separator, &brkt);

  if (token == NULL)
        break;
}

【问题讨论】:

  • 注意,当你tokeinzing字符串时,字符串指针应该只在第一个strtok()调用中,直到字符串结尾的所有后续调用都应该将0NULL)作为第一个参数。
  • 那我怎样才能打破分词循环呢?

标签: c string


【解决方案1】:

看看这个。注意:没有测试和优化

    #include <stdio.h>
#include <string.h>
#include <malloc.h>

#include "strtok.h"

//char temp[100];

char *strTok(char *string, char *delimiter)
{
    static char *inputStr = NULL;
    char *temp = NULL;
    int i,count,j;

    if (string != NULL)
    {

        if( inputStr != NULL)
            free(inputStr);     

        inputStr = (char*) malloc (sizeof(char) * strlen(string));
        strcpy(inputStr,string);

    }

    for( i = 0 ; i < strlen(inputStr) ; i++ )
    {
        if ( inputStr[i] == delimiter[0] )
        {
            count = 1;
            for( j = 1 ; j < strlen(delimiter) ; j++ )
            {
                if ( inputStr[i+j] == delimiter[j] )
                    count ++;
                else
                    break;
            }           
        }   

        if ( count == strlen(delimiter) )
        {

            if( temp != NULL)
                free(temp);     


            temp = (char*) malloc (sizeof(char) * i);   

            strncpy(temp,inputStr,i);
            strcpy(inputStr,inputStr+i+strlen(delimiter));

            return temp;

        }


    }

    return inputStr;
}

/*int main()
{
    char *str = strTok("title:4:int",":");
    printf("%s\n",str);

    str = strTok(NULL,":");
    printf("%s\n",str);

    str = strTok(NULL,":");
    printf("%s\n",str);

    str = strTok(NULL,":");
    printf("%s\n",str);
    str = strTok("director:int:sdjjsd",":");
    printf("%s\n",str);

    str = strTok(NULL,":");
    printf("%s\n",str);


}*/

【讨论】:

    【解决方案2】:

    我最终使用了这个的修改版本:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int
    main(int argc, char *argv[])
    {
        char *str1, *str2, *token, *subtoken;
        char *saveptr1, *saveptr2;
        int j;
    
        if (argc != 4) {
            fprintf(stderr, "Usage: %s string delim subdelim\n",
                    argv[0]);
            exit(EXIT_FAILURE);
        }
    
        for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
    
           token = strtok_r(str1, argv[2], &saveptr1);
    
           if (token == NULL)
                break;
            printf("%d: %s\n", j, token);
    
            for (str2 = token; ; str2 = NULL) {
                subtoken = strtok_r(str2, argv[3], &saveptr2);
                if (subtoken == NULL)
                    break;
                printf("     --> %s\n", subtoken);
            }
        }
    
        exit(EXIT_SUCCESS);
    } /* main */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 2016-11-25
      相关资源
      最近更新 更多