Что происходит, когда вы выводите NUL, зависит от устройства вывода.
Это непечатаемый символ, то есть isprint('\0') == 0
; поэтому при выходе на дисплейное устройство он не оказывает заметного влияния. Однако при перенаправлении в файл (или при вызове fprintf()
) он вставляет в файл NUL (нулевой байт); смысл этого будет зависеть от того, как используется файл.
При выводе на строку C он будет интерпретироваться как ограничитель строк стандартными функциями обработки строк, хотя любые другие последующие спецификаторы формата будут по-прежнему приводить к тому, что данные будут помещены в буфер после NUL, которые будут невидимы для стандартные функции обработки строк. Это может быть полезно, если в конечном итоге массив не должен интерпретироваться как строка C.
Я могу рискнуть утечками памяти или другими проблемами, если я, например. запустите этот NULL в точке в std :: string.c_str()?
Это совершенно непонятно, что вы имеете в виду, но если вы предлагаете, используя указатель, возвращаемый std::string.c_str()
в качестве буфера для sprintf()
; нет! c_str()
возвращает const char*
, изменение строки с помощью такого указателя не определено. Это, однако, другая проблема, а вовсе не связанная с введением NUL в строку.
Каковы наилучшие способы избежать этого оговорки (дезинфицировать вход?)
Я изо всех сил пытаюсь придумать обстоятельство, в котором вы могли бы «случайно» написать такой код, так зачем вам его защищать !? У вас есть особое обстоятельство? Несмотря на то, я считаю, это неправдоподобно, и, вероятно, нет необходимости, что так трудно о:
if(c != 0)
{
printf("%c", c) ;
}
или, возможно, более полезно (так как есть и другие символы, которые Вы могли бы хотеть, чтобы избежать на выходе)
if(isgraph(c) || isspace(c))
{
printf("%c", c) ;
}
который будет выводить только видимые символы и пробелы (пробел, '\t'
, '\f'
, , '\n'
, '\r'
).
Обратите внимание, что вы могли бы также рассмотреть isprint()
, а не isgraph(c) || isspace(c)
, но это исключает '\t'
, '\f'
, , '\n'
и '\r'
Макрос NULL и символ '\ 0' - это не одно и то же. Последнее часто обозначается как NUL, имеющим ASCII, но это не то же самое, что и NULL. – Clifford
@Clifford: Системы, в которых NULL не был нулем, существовали в прошлом, но в наши дни, если вы не программируете какие-то давно устаревшие большие динозавры, вы не рискуете столкнуться с этим предостережением. –
Думаю, вы пропустили мою точку - 'NULL' - это макрос, представляющий указатель на нуль *, а' \ 0' - это символьная константа (типа 'int' в C и' char' в C++). Кроме того, независимо от фактического машинного зависимого битового шаблона нулевого указателя, C++ * гарантирует *, что нуль может быть неявно преобразован в такой указатель. Моя точка зрения заключалась в том, что в этом контексте вы можете ссылаться на nul, null-character, NUL или '\ 0', но не должны использовать макрос' NULL' для представления такого символа. Размещение слова в «разметке кода» может означать NULL-макрос. – Clifford