Compartir a través de


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

  1. Llame a GetBuffer en relación con un objeto CString e indique la longitud de búfer que necesita.

  2. Use el puntero que GetBuffer devuelve para escribir caracteres directamente en el objeto CString.

  3. Llame a ReleaseBuffer en relación con el objeto CString para actualizar toda la información de estado de CString interna (por ejemplo, la longitud de la cadena). Tras modificar el contenido de un objeto CString directamente, debe llamar a ReleaseBuffer antes de llamar a cualquier otra función miembro de CString.

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.

Consulte también

Cadenas (ATL/MFC)
Pasar argumentos de CString