Sscanf для этого типа строки - PullRequest
1 голос
/ 31 декабря 2011

Я не совсем уверен, даже после прочтения документации, как это сделать с помощью sscanf.

Вот что я хочу сделать: учитывая строку текста:

Читать допервые 64 символа или до пробела. Тогда будет пробел, an =, а затем еще один пробел.После этого я хочу извлечь другую строку либо до конца строки, либо до достижения 8192 символов.Я также хотел бы изменить любые вхождения во второй строке "\ n" на фактический символ новой строки.

У меня есть: "% 64s =% 8192s", но я не думаю, что это правильно.

Спасибо

Пример:

element.name = hello \ nworld

Будет иметь строку 1 с element.name и string2 как

hello
world

Ответы [ 2 ]

1 голос
/ 31 декабря 2011

Ваша строка формата выглядит мне правильно;однако sscanf не изменит вхождения \ n на что-либо еще.Чтобы сделать это, вам нужно написать цикл, который использует strtok или даже просто цикл for, оценивающий каждый символ в строке и заменяющий его на любой символ, который вы предпочитаете.Вам также необходимо оценить возвращаемое значение sscanf, чтобы определить, действительно ли две строки были отсканированы правильно.sscanf возвращает номер поля, успешно отсканированного в соответствии с вашей форматной строкой.

@ sehe показывает правильное использование sscanf, включая проверку правильности возвращаемого значения.

1 голос
/ 31 декабря 2011

Я рекомендую для этого std :: regex, но, кроме того, с небольшой проверкой ошибок все будет в порядке:

#include <cstdio>

int main(int argc, const char *argv[])
{
    char s1[65];
    char s2[8193];
    if (2!=std::scanf("%64s = %8192s", s1, s2))
        puts("oops");
    else
        std::printf("s1 = '%s', s2 = '%s'\n", s1, s2);
    return 0;
}
...