кажется, что strtol()
и strtod()
эффективно позволяют (и силы), вы откинуть константность в строке:Являются ли strtol, strtod небезопасными?
#include <stdlib.h>
#include <stdio.h>
int main() {
const char *foo = "Hello, world!";
char *bar;
strtol(foo, &bar, 10); // or strtod(foo, &bar);
printf("%d\n", foo == bar); // prints "1"! they're equal
*bar = 'X'; // segmentation fault
return 0;
}
Выше я не выполнил какой-либо бросает себя. Тем не менее, strtol()
в основном отличает мой const char *
в char *
для меня, без каких-либо предупреждений. (Фактически, это не позволит вам вводить bar
как const char *
, и поэтому заставляет небезопасное изменение типа.) Разве это не опасно?
Но C++ не мешает вам перегружать функцию: у вас может быть 'long int strtol (char * nptr, char ** endptr, int base);' * и * 'long int strtol (const char * nptr, const char ** endptr, int base); ': это исправляет вашу ошибку компиляции. Действительно, стандарт делает это для других таких функций, таких как 'strchr' и' strstr', – Thanatos
Вы можете обратиться к веб-сайту C FAQ [В чем разница между 'const char * p',' char const * p' и 'char * const p'?] (http://c-faq.com/ansi/constptrconst.html) и, более конкретно, [Почему я не могу передать' char ** 'функции, которая ожидает' const char ** '?] (http://c-faq.com/ansi/constmismatch.html) вместо часто задаваемых вопросов по C++, хотя я не полностью убежден, что объяснения легко понять. –