Используйте sscanf для чтения, пока не будет найдена последовательность - PullRequest
0 голосов
/ 27 октября 2018

Я бы использовал strchr, но я хочу найти последовательность, которая выглядит следующим образом: "% c" - включая пробелы.

Но у меня есть две проблемы:

  • Можно ли даже сопоставить последовательность, а не набор символов.
  • Можете ли вы сопоставить спецификаторы формата, например, "[^% c]" - конечно, это не сработает, и я не смогне найти никакой литературы, которая углубляется в этот формат.

Цель состоит в том, чтобы прочитать неопределенное количество строк (которые вместе не превышают размер буфера) в один буфер, доНайден разделенный пробелами символ:

char buf[50];
sscanf("string1 string2 string3 M other input", "%[^ %c ]", buf);
printf("%s", buf); //This would output "string1 string2 string3"

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

strspn и strcspn могут использоваться для поиска одного символа в окружении пробелов.

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

int main( void) {
    char *text[] = { "string1 string2 string3 M other input"
                      , "string1 string2 string3 other input M"
                      , "M string1 string2 string3 other input M"};
    int offset = 0;
    int spaces = 0;
    int length = 0;

    for ( int each = 0; each < 3; each++) {
        offset = 0;
        do {
            spaces = strspn ( text[each] + offset, " ");//consecutive spaces
            offset += spaces;

            length = strcspn ( text[each] + offset, " ");//consecutive not space
            offset += length;

        } while ( 1 != length && 0 != *(text[each] + offset));

        if ( 1 == length) {
            printf ( "[%.*s]\n", offset - ( spaces + length), text[each]);
        }
        else {
            printf ( "[%s]\n", text[each]);
        }
    }

    return 0;
}
0 голосов
/ 27 октября 2018

strchr может найти первое вхождение символа в строку.Конец шаблона можно найти, сравнив расстояние между первым непробельным ch и вторым.

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

// The input buffer must match the pattern "string string ... ch"
const char* get_endof_pattern(const char *buffer)
{
    const char *first_non_space = buffer;
    const char *second_non_space = strchr(first_non_space, ' ') + 1;
    if (!second_non_space)
        return NULL;

    while (second_non_space - first_non_space > 2) {
        first_non_space = second_non_space;
        second_non_space = strchr(first_non_space, ' ') + 1;

        if (!second_non_space)
            return NULL;
    }

    return first_non_space;
}
...