Что цель использовать [^ нотация в scanf?

Чтобы распечатать данные с клиента, достаточно иметь WireTap на канале fromTcp или toEcho и подключить его к другому каналу для печати. Как правило, LoggingHandler достаточно, чтобы подписаться на этот канал прослушивания.

Дополнительную информацию можно найти в Справочном руководстве: https://docs.spring.io/spring-integration/docs/current/reference/html/#channel-interceptors

.

6
задан templatetypedef 9 March 2017 в 22:33
поделиться

3 ответа

Основная причина классов символов заключается в том, что запись% s останавливается на первом символе пробела, даже если Вы указываете длину поля, и вы часто этого не хотите. В этом случае нотация класса символов может быть чрезвычайно полезна.

Рассмотрим этот код, чтобы прочитать строку длиной до 10 символов, отбрасывая все лишние, но оставляя пробелы:

#include <ctype.h>
#include <stdio.h>

int main(void)
{
    char buffer[10+1] = "";
    int rc;
    while ((rc = scanf("%10[^\n]%*[^\n]", buffer)) >= 0)
    {
            int c = getchar();
            printf("rc = %d\n", rc);
            if (rc >= 0)
                    printf("buffer = <<%s>>\n", buffer);
            buffer[0] = '\0';
    }
    printf("rc = %d\n", rc);
    return(0);
}

Это был фактически пример кода для обсуждения комп. .lang.c.moderated (около июня 2004 г.) относится к вариантам getline () .


По крайней мере, царит некоторая путаница. Первый спецификатор формата, % 10 [^ \ n] , читает до 10 не-новых символов, и они назначаются в буфер вместе с завершающим нулем. Второй спецификатор формата, % * [^ \ n] содержит символ подавления присваивания ( * ) и считывает ноль или более оставшихся нестрочных символов из входных данных. Когда функция scanf () завершается, ввод указывает на следующий символ новой строки. Тело цикла считывает и печатает этот символ, поэтому, когда цикл перезапускается, ввод смотрит на начало следующей строки. Затем процесс повторяется. Если строка короче 10 символов, то эти символы копируются в буфер, а формат «ноль или более не-новых строк» ​​обрабатывает ноль не-новых строк.

так что когда цикл перезапускается, вход смотрит в начало следующей строки. Затем процесс повторяется. Если строка короче 10 символов, то эти символы копируются в буфер, а формат «ноль или более не-новых строк» ​​обрабатывает ноль не-новых строк.

так что когда цикл перезапускается, вход смотрит в начало следующей строки. Затем процесс повторяется. Если строка короче 10 символов, то эти символы копируются в буфер, а формат «ноль или более не-новых строк» ​​обрабатывает ноль не-новых строк.

6
ответ дан 9 December 2019 в 20:48
поделиться

The constructs like %[a] and %[^a] exist so that scanf() can be used as a kind of lexical analyzer. These are sort of like %s, but instead of collecting a span of as many "stringy" characters as possible, they collect just a span of characters as described by the character class. There might be cases where writing %[a-zA-Z0-9] might make sense, but I'm not sure I see a compelling use case for complementary classes with scanf().

IMHO, scanf() is simply not the right tool for this job. Every time I've set out to use one of its more powerful features, I've ended up eventually ripping it out and implementing the capability in a different way. In some cases that meant using lex to write a real lexical analyzer, but usually doing line at a time I/O and breaking it coarsely into tokens with strtok() before doing value conversion was sufficient.

Edit: I ended ripping out scanf() typically because when faced with users insisting on providing incorrect input, it just isn't good at helping the program give good feedback about the problem, and having an assembler print "Error, terminated." as its sole helpful error message was not going over well with my user. (Me, in that case.)

4
ответ дан 9 December 2019 в 20:48
поделиться

Это как наборы символов из регулярных выражений; [0-9] соответствует строке цифр, [^ aeiou] соответствует всему, что не является строчной гласной, и т. Д.

Есть все виды использования, например как извлечение чисел, идентификаторов, фрагментов пробелов и т. д.

2
ответ дан 9 December 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: