Operaciones de CString
relacionadas con cadenas de estilo C
Un objeto CString
contiene datos de cadenas de caracteres. CString
hereda el conjunto de métodos y operadores definidos en la plantilla de clase CStringT
para trabajar con los datos de cadena. (CString
es una typedef
que especializa a CStringT
para que trabaje con el tipo de datos de caracteres que admite CString
).
CString
no almacena datos de caracteres internamente como una cadena terminada en un valor nulo de estilo C. En su lugar, CString
realiza un seguimiento de la longitud de los datos de caracteres para, así, poder vigilar los datos y el espacio que precisan de forma más segura.
Con todo, CString
acepta cadenas de estilo C y ofrece formas de acceder a los datos de caracteres como una cadena de estilo C. Este tema está compuesto por las siguientes secciones, donde se explica cómo usar un objeto CString
como si fuera una cadena terminada en un valor nulo de estilo C.
Uso de CString
como una cadena de estilo C que termina en un valor NULL
Para usar un objeto CString
como una cadena de estilo C, convierta el objeto a LPCTSTR
. En el siguiente ejemplo, CString
devuelve un puntero a una cadena terminada en un valor nulo de estilo C de solo lectura. La función strcpy
coloca una copia de esa cadena de estilo C en la variable myString
.
CString aCString = "A string";
char myString[256];
strcpy(myString, (LPCTSTR)aCString);
Puede usar métodos de CString
(SetAt
, por ejemplo) para modificar caracteres concretos del objeto de cadena. Sin embargo, el puntero LPCTSTR
es temporal y deja de ser válido en cuanto se efectúa un cambio en CString
. CString
también puede quedar fuera de su ámbito y eliminarse automáticamente. Le recomendamos que obtenga un puntero LPCTSTR
actualizado de un objeto CString
cada vez que vaya a usar uno.
Habrá veces en las que necesite una copia de los datos de CString
para modificarlos directamente. Use la función más protegida strcpy_s
(o la función portable de Unicode/MBCS _tcscpy_s
) para copiar el objeto CString
en otro búfer. Ahí, los caracteres se podrán modificar con menor riesgo, como verá en este ejemplo.
CString theString(_T("This is a test"));
int sizeOfString = (theString.GetLength() + 1);
LPTSTR lpsz = new TCHAR[sizeOfString];
_tcscpy_s(lpsz, sizeOfString, theString);
//... modify lpsz as much as you want
Nota:
El tercer argumento para strcpy_s
(o el _tcscpy_s
portable de Unicode o de MBCS) es un const wchar_t*
(Unicode) o un const char*
(ANSI). En el ejemplo anterior se pasa un CString
para este argumento. El compilador de C++ emplea automáticamente la función de conversión definida para la clase CString
, que convierte un CString
en un LPCTSTR
. La posibilidad de definir operaciones de conversión de un tipo a otro es una de las características más útiles de C++.
Trabajar con funciones de cadena de biblioteca en tiempo de ejecución estándar
Debe poder encontrar un método de CString
para realizar cualquier operación de cadena en la que puedan usarse funciones de cadena de biblioteca en tiempo de ejecución estándar, como strcmp
(o la función portable de Unicode/MBCS _tcscmp
).
Si debe usar las funciones de cadena en tiempo de ejecución de C, puede usar las técnicas descritas en Uso de CString
como una cadena de estilo C terminada en NULL. Puede copiar el objeto CString
en un búfer de cadena de estilo C equivalente, llevar a cabo las operaciones que correspondan en dicho búfer y, luego, asignar la cadena de estilo C resultante de vuelta a un objeto CString
.
Modificación directa del contenido de CString
La mayoría de las veces, conviene usar las funciones miembro de CString
para modificar el contenido de un objeto CString
o para convertir CString
en una cadena de caracteres de estilo C.
Existen algunas situaciones en las que sí tiene sentido modificar el contenido de CString
directamente (por ejemplo, al trabajar con funciones de sistema operativo que requieren un búfer de caracteres).
Los métodos GetBuffer
y ReleaseBuffer
dan acceso al búfer de caracteres interno de un objeto CString
, donde podrá modificarlo directamente. En los siguientes pasos se explica cómo usar estas funciones con este fin.
Para usar GetBuffer
y ReleaseBuffer
para acceder al búfer de caracteres internos de un objeto CString
Llame a
GetBuffer
en relación con un objetoCString
e indique la longitud de búfer que necesita.Use el puntero que
GetBuffer
devuelve para escribir caracteres directamente en el objetoCString
.Llame a
ReleaseBuffer
en relación con el objetoCString
para actualizar toda la información de estado deCString
interna (por ejemplo, la longitud de la cadena). Tras modificar el contenido de un objetoCString
directamente, debe llamar aReleaseBuffer
antes de llamar a cualquier otra función miembro deCString
.
Uso de objetos CString
con funciones de argumento variable
Algunas funciones de C toman un número variable de argumentos. Un ejemplo significativo de esto es printf_s
. Debido al modo en que esta función se declara, el compilador no puede saber con seguridad de qué tipo son los argumentos ni distinguir qué operación de conversión debe realizar en cada argumento. Por lo tanto, es fundamental usar una conversión de tipo explícita al pasar un objeto CString
a una función que toma un número variable de argumentos.
Para usar un objeto CString
en una función de argumento variable, convierta explícitamente el objeto CString
en una cadena LPCTSTR
, como se indica en el siguiente ejemplo.
CString kindOfFruit = _T("bananas");
int howmany = 25;
_tprintf_s(_T("You have %d %s\n"), howmany, (LPCTSTR)kindOfFruit);
Especificación de parámetros formales de CString
En la mayoría de las funciones que necesitan un argumento de cadena, lo mejor es especificar el parámetro formal en el prototipo de la función como un puntero const
a un carácter (LPCTSTR
), y no un CString
. Cuando un parámetro formal se especifica como un puntero const
a un carácter, se puede pasar un puntero a una matriz de TCHAR
, a una cadena literal ["hi there"
] o a un objeto CString
. El objeto CString
se convertirá automáticamente en una cadena LPCTSTR
. Podrá usar una cadena LPCTSTR
en cualquier parte donde pueda usar un objeto CString
.
Si el argumento no se va a modificar, también puede especificar un parámetro formal como una referencia de cadena constante (es decir, const CString&
). Quite el modificador const
si la cadena se va a modificar mediante la función. Si se pretende obtener un valor nulo predeterminado, inicialícelo en la cadena null [""
], como se muestra aquí:
void AddCustomer(const CString& name, const CString& address,
const CString& comment = _T(""));
Para la mayoría de los resultados de función, se puede devolver simplemente un objeto CString
por valor.