簡體   English   中英

一次只從strtok獲取一個令牌

[英]Get only one token from strtok at a time

請考慮以下具有兩個不同字符串的方案:

Row1: MyID-MyName-MyAddress-MyNumber-MyNumber2-MyAlias
Row2: MyID-MyName-MyAddress-MyNumber--MyAlias

在第二個示例中,缺少MyNumber2的值。 我需要使用strtok()提取每個屬性。 到目前為止,這是我的代碼:

MyID      = strtok (str,  "-"); //where 'str' is the full string
MyName    = strtok (NULL, "-");
MyAddress = strtok (NULL, "-");
MyNumber  = strtok (NULL, "-");
MyNumber2 = strtok (NULL, "-");
MyAlias   = strtok (NULL, "-");

第一個例子運行良好,我能夠將每個屬性存儲在變量中。 但是,在第二個例子中,我遇到了麻煩:

當進入變量MyNumber2strtok()不返回空字符串(如我所願)。 相反,它會讀取字符串,直到與分隔符"-"不匹配的第一個字符,從而忽略字符串中空值的存在。

是否有可能每個分隔符只拆分一次字符串?

我認為你應該使用標准函數strchr 例如

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

int main( void )
{
    char s[] = "MyID-MyName-MyAddress-MyNumber--MyAlias";

    for ( char *p = s, *q = s; p != NULL; p = q )
    {
        q = strchr( p, '-' );
        if ( q )
        {            
            printf( "\"%*.*s\"\n", ( int )(q - p ), ( int )( q - p ), p );
            ++q;
        }
        else
        {
            printf( "\"%s\"\n", p );
        }
    }
}    

程序輸出是

"MyID"
"MyName"
"MyAddress"
"MyNumber"
""
"MyAlias"

Strtok無法標記分隔符之間的空值。 要了解原因, 請在此處查看第一個答案

我和你一樣處於同樣的境地。 我使用strstr做同樣的事情,如下所示:

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

void main(void)
{
    char str[] = "MyID-MyName-MyAddress-MyNumber--MyAlias";
    char * str1, * token;
    int i = 0;
    int parsed_buffer_length = 0;
    char * previous_delimiter_index = str;
    char * delimiter_index = str;
    for(;;)
    {
            str1 = str+parsed_buffer_length;
            delimiter_index = strstr(str1,"-");
            if(delimiter_index==NULL)
            {
                    printf("%s",str1);  //prints last token
                    break;
            }
            token = malloc(delimiter_index-previous_delimiter_index+1);
            memset(token,'\0',delimiter_index-previous_delimiter_index+1));
            strncpy(token,str1,(delimiter_index-previous_delimiter_index));

            printf("%s\n",token);

            parsed_buffer_length = (int)(parsed_buffer_length+delimiter_index-previous_delimiter_index+1);
            previous_delimiter_index = delimiter_index+1;
            free(token);
    }
}

這給出了輸出:

MyID
MyName
MyAddress
MyNumbers

MyAlias

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM