Разбор строки и подстрока в c - PullRequest
1 голос
/ 25 апреля 2010

Я пытаюсь разобрать строку ниже, чтобы получить подстроку stringI-wantToGet:

const char *str = "Hello \"FOO stringI-wantToGet BAR some other extra text";

str будет различаться по длине, но всегда будет одинаковым шаблономи BAR

Я имел в виду что-то вроде:

const char *str = "Hello \"FOO stringI-wantToGet BAR some other extra text";

char *probe, *pointer;
probe = str;
while(probe != '\n'){
    if(probe = strstr(probe, "\"FOO")!=NULL) probe++;
    else probe = "";
    // Nulterm part
    if(pointer = strchr(probe, ' ')!=NULL) pointer = '\0';  
    // not sure here, I was planning to separate it with \0's
}

Любая помощь будет признательна.

Ответы [ 2 ]

5 голосов
/ 25 апреля 2010

У меня было немного времени на руках, так что вы здесь.

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

int getStringBetweenDelimiters(const char* string, const char* leftDelimiter, const char* rightDelimiter, char** out)
{
    // find the left delimiter and use it as the beginning of the substring
    const char* beginning = strstr(string, leftDelimiter);
    if(beginning == NULL)
        return 1; // left delimiter not found

    // find the right delimiter
    const char* end = strstr(string, rightDelimiter);
    if(end == NULL)
        return 2; // right delimiter not found

    // offset the beginning by the length of the left delimiter, so beginning points _after_ the left delimiter
    beginning += strlen(leftDelimiter);

    // get the length of the substring
    ptrdiff_t segmentLength = end - beginning;

    // allocate memory and copy the substring there
    *out = malloc(segmentLength + 1);
    strncpy(*out, beginning, segmentLength);
    (*out)[segmentLength] = 0;
    return 0; // success!
}

int main()
{
    char* output;
    if(getStringBetweenDelimiters("foo FOO bar baz quaz I want this string BAR baz", "FOO", "BAR", &output) == 0)
    {
        printf("'%s' was between 'FOO' and 'BAR'\n", output);
        // Don't forget to free() 'out'!
        free(output);
    }
}
0 голосов
/ 25 апреля 2010

В первом цикле сканируйте до тех пор, пока не найдете свою первую строку разделителя. Установите там указатель привязки.

если найдено, из ptr привязки во втором цикле сканируйте, пока не найдете строку 2-го разделителя или не встретите конец строки

Если не в конце строки, скопировать символы между ptr привязки и вторым ptr (плюс корректировки для пробелов и т. Д., Которые вам нужны)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...