如何在字符串中提取数据?

时间:2016-05-30 10:12:51

标签: c string extract

我有这个字符串:

('string1', 'string2', 'string3');

我想只提取string1,string2,string3。

的数据

尝试过这样的事情:

scanf("%s", &data1);
printf("%s", data1);
if(d=='`')
{
    scanf("%s", &sampah);
    printf("%s", sampah);
    if(d=='`')
    {
        scanf("%s", &data2);
        printf("%s", data2);
        if(d=='`')
        {
            scanf("%s", &sampah);
            printf("%s", sampah);
            if(d=='`')
            {
                scanf("%s", &data3);
                printf("%s", data3);
                if(d=='`')
                {
                    scanf("%s", &sampah);
                    printf("%s", sampah);
                    if(d=='`')
                    {
                        scanf("%s", &data4);
                        printf("%s", data4);    
                    }   
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

你需要简单的有限状态机,它有两个状态"在引号内"和"外部引号",引号在这两个状态之间转换。

类似的东西:

void tokenize(const char *str)
{
    const char *c = str;
    int in_quotes = 0;
    const char *start_of_token;

    while (*c) {                        // examine each character
        if (*c == '\'') {
            if (!in_quotes) {
                start_of_token = c + 1; // quoted string starts at character following the quote
                in_quotes = 1;
            } else {
                // here is the end of token. It starts at start_of_token
                // and is c-start_of_token characters long
                int token_length = c-start_of_token
                do_something(start_of_token, token_length);
                in_quotes = 0;
            }
        }
        c++;
    }
}

答案 1 :(得分:0)

像这样

#include <stdio.h>

int main(void){
    char str[] = "('string1', 'string2', 'string3');";
    char s1[16], s2[16], s3[16], ch;

    if(3==sscanf(str, "( '%15[^']' , '%15[^']' , '%15[^']' ) ; %c", s1, s2, s3, &ch)){
        printf("'%s'\n", s1);
        printf("'%s'\n", s2);
        printf("'%s'\n", s3);
    }
    return 0;
}