Регулярные выражения с scanf в C

Я пытаюсь добиться следующего без какого-либо успеха:

Удаление открытия

сообщение "

и тянущийся

"

оставляя содержимое между ними и сохраняя его в моей переменной, используя регулярные выражения sscanf. Я написал следующий код:

sscanf( buffer, "message \"%[^\"]", message)

Это хорошо работает, когда у меня появляется что-то вроде сообщения "Привет!", Но когда я пытаюсь выполнить следующую строку, я получаю только пробел между двумя кавычками.

сообщение "" "" Это тест "" ""

Результат для этого должен быть "" "Это тест" ""

Есть ли способ обновить мое выражение, чтобы оно включало это экстремальное событие сообщения? Я попытался найти это и в Google, и здесь, и не смог найти элегантный ответ. Я знаю, что это возможно, используя строковые манипуляции с большим количеством строк кода, но я пытаюсь что-то более простое здесь.

PS Трейлинг "является концом выражения и является обязательным для программы, после этого ничего не получается.

Заранее спасибо за отзыв!

1 ответ

Решение

Если вы не используете регулярное выражение для всего этого:

Оригинальная версия:

sscanf(buffer, "message \"%[^$]", message); // remove 'message "'
message[strlen(message) - 1] = '\0'; // remove trailing '"'

Безопасная, правильная и универсальная версия:

char* buffer = ...;
const char* prefix = "message \"";
const char* suffix = "\"";

if (strstr(buffer, prefix) != buffer) {
    // error, doesn't start with `prefix`
}

buffer += strlen(prefix);

char* suffixStart = strrchr(buffer, suffix[0]);
if (!suffixStart || strcmp(suffixStart, suffix) != 0) {
    // error, doesn't end with `suffix`
}

*suffixStart = '\0'; // strip `suffix`
Другие вопросы по тегам