Что происходит, когда вы выводите 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'
,'\v'
,'\n'
,'\r'
).
Обратите внимание, что вы также можете рассматривать isprint()
, а не isgraph(c) || isspace(c)
, но это исключает '\t'
, '\f'
, '\v'
, '\n'
и '\r'
.
person
Clifford
schedule
10.05.2010
NULL
— это макрос, представляющий нулевой указатель, а\0
— символьная константа (типаint
в C иchar
в C++). Более того, независимо от фактического машинно-зависимого битового шаблона нулевого указателя, C++ гарантирует, что ноль может быть неявно преобразован в такой указатель. Я хотел сказать, что в этом контексте вы можете ссылаться на nul, нулевой символ, NUL или\0
, но не должны использовать макросNULL
для представления такого символа. Размещение слова вcode mark-up
может подразумевать макрос NULL. - person Clifford   schedule 24.09.2014