Uso de cadenas sin procesar
Sí, a veces realmente puedes hacer esto. Al usar const char *, las matrices de char asignadas en la pila y los literales de cadena, puede hacerlo de tal manera que no haya ninguna asignación de memoria.
Escribir dicho código requiere a menudo más pensamiento y cuidado que usar cadenas o vectores, pero con las técnicas adecuadas se puede hacer. Con las técnicas adecuadas, el código puede ser seguro, pero siempre debe asegurarse de que, al copiar en char [], tenga algunas garantías sobre la longitud de la cadena que se está copiando, o verifique y maneje cadenas de gran tamaño con elegancia. No hacerlo es lo que le dio a la familia de funciones strcpy la reputación de ser insegura.
Cómo las plantillas pueden ayudar a escribir búferes de caracteres seguros
En cuanto a la seguridad de los búferes char [], las plantillas pueden ayudar, ya que pueden crear una encapsulación para manejar el tamaño del búfer por usted. Microsoft implementa, por ejemplo, plantillas como ésta para proporcionar reemplazos seguros para strcpy. El ejemplo aquí se extrae de mi propio código, el código real tiene muchos más métodos, pero esto debería ser suficiente para transmitir la idea básica:
template <int Size>
class BString
{
char _data[Size];
public:
BString()
{
_data[0]=0;
_data[Size-1]=0;
}
const BString &operator = (const char *src)
{
strncpy(_data,src,Size-1);
return *this;
}
operator const char *() const {return _data;}
};
template <int Size>
inline const BString<Size> & strcpy(BString<Size> &dst, const char *src)
{
return dst = src;
}