拆分/解析char数组,并在两个令牌C之间获得值



因此,在搜索和谷歌搜索后,我无法弄清楚如何在char数组中的两个令牌之间提取一个值。这是我的一些代码:

    char *data= (char *) malloc( 50);
    strcpy(data, "123 123 123 abcdef/456->ghijklm/789 123 123");

我需要将" abcdef"作为str1和" ghijkm"提取为str2。

每个人都推荐的第一个解决方案是strtok如下:

str1 = strtok(temp, "/");    // str1=abcdef

但是那个偏斜呢?我的意思是str2,所以。

Q1:如何将ghijkmn提取为str2?

Q2:我还能利用其他现有的实用程序功能吗?或其他解决这种情况的解决方案?

[添加:]我需要的是所有的琴弦被白色空间隔开。所有" 123" s均为所需格式,除了一个不同的格式。我只需要如上所述的两个部分。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *between(const char *str, char start, char end){
//return between start and end. However, start and end are not included.
    const char *s = NULL, *e;
    if(!str || !*str) return NULL;
    if((e = strchr(str+1, end)) == NULL)
        return NULL;//end character not found
    for(int i = e-str-1; i >= 0; --i){
        if(str[i] == start){
            s = str + i + 1;
            break;
        }
    }
    if(!s)
        return between(e, start, end);//start character not found
    int len = e - s;
    char *ret = malloc(len + 1);
    if(ret){
        memcpy(ret, s, len);
        ret[len] = 0;
    }
    return ret;
}
int main(void){
    const char *data = "123 123 123 abcdef/456->ghijklm/789 123 123";
    char *str1 = between(data, ' ', '/');
    if(str1){
        printf("str1: '%s'n", str1);
        char *str2 = between(data, '>', '/');//use strstr+strlen+1 for after str1, or save search position
        if(str2)
            printf("str2: '%s'n", str2);
        free(str1);free(str2);
    }
    return 0;
}

因此,如果您想要所有字符串,并且只是其中一个字符串,则可以在且仅当' abcdef/456的位置时使用以下代码 -> ghijklm/789 'in data 数组已修复:

                //data ="123 123 123 123 123 123 123" abcdef/456->ghijklm/789 123");
                char temp[/*strlen(data)*/];
                char temp2[/*strlen(data)*/];
                char *splitPtr, *p, *abcdef, *ghijklm, _789;
                splitPtr = data;
                splitCounter = 0;
                for (char *p = strtok_r(data, " ", &splitPtr); p; p = strtok_r(NULL, " ", &splitPtr)) {
                    if (splitCounter == _the_location_of_special_text) {
                        strcpy(temp, p);                        
                        abcdef = strtok(temp, "/");
                        char *gt = strchr(p, '>')+1;
                        int index = (int)(gt - p);                        
                        strcpy(temp2, p+index);
                        ghijklm = strtok(temp2, "/");
                        _789 = strrchr( p, '/' )+1;
                    }
                    else {
                    //use the p as 123
                         }
                    splitCounter += 1;
                }
                printf ("Part 1: %sn,Part 2: %sn,Part 3: %sn", abcdef, ghijklm , _789);

输出:

第1部分:ABCDEF

第2部分:ghijklm

第3部分:789

iDeone代码

#include <stdio.h>
int main(void)
{
    char text[]="123 123 123 abcdef/456->ghijklm/789 123 123";
    char* ptr = strtok(text, " ");
    char* slash;
    char* str1;
    char* str2;
    while(ptr)
    {
        if (slash = strstr(ptr, "/"))
        {
            *slash = '';
            str1 = ptr;
            ptr = ++slash;
            break;
        }
        ptr = strtok(NULL, " ");
    }
    str2 = strtok(ptr, ">");
    while(ptr)
    {
        if (slash = strstr(ptr, "/"))
        {
            *slash = '';
            str2 = ptr;
            break;
        }
        ptr = strtok(NULL, " ");
    }
    printf("Found a: %s; and b: %sn", str1, str2);
    return 0;
}

输出

Found a: abcdef; and b: ghijklm

因此,据我了解,您只想从char []数组中提取完全字母的字符串。如果是这种情况,您只需使用strtok解析单词,并测试字符串是否使用<ctype.h>中的isalpha具有所有字母字母。

类似这样可以起作用的东西:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int
main(int argc, char *argv[]) {
    char data[] = "123 123 123 abcdef/456->ghijklm/789 123 123";
    char *word;
    const char *delim = " /->";
    int i, validlet, strnum = 1;
    word = strtok(data, delim);
    while (word) {
        validlet = 0;
        for (i = 0; word[i]; i++) {
            if (!isalpha(word[i])) {
                break;
            }
            validlet++;
        }
        if (validlet == strlen(word)) {
            printf("Found str %d: %sn",strnum, word);
            strnum++;
        }
        word = strtok(NULL, delim);
    }
    return 0;
}

最新更新