VC++: wcslen y el significado de una serie de funciones
Hay varios tipos diferentes de cadenas. Los principiantes deben aprender char al principio. Esta es la cadena más básica y utiliza código ASCII para representar el inglés. Ahora los programas recién escritos deben usar caracteres anchos. El tipo es wchar_t. Un wchar_t ocupa dos bytes. Independientemente de si es inglés o chino, esta codificación es una codificación Unicode que no funcionará incluso si se ejecuta en sistemas con otros idiomas. Se puede mostrar correctamente, siempre que el sistema tenga instaladas fuentes chinas. Otro tipo es MBCS, que se traduce al chino como una cadena de varios bytes. Un carácter se compone de varios bytes, no necesariamente 2 bytes, pero puede tener más de dos bytes. GB2312, UTF8, etc., todos entran en esta categoría.
El compilador no puede convertir automáticamente char y wchar_t, porque la conversión entre ellos debe especificar la página de códigos.
Microsoft proporciona una serie de funciones para operar estas cadenas. Solo necesita buscar strlen en msdn. Aparecerá wstrlen, el que comienza con w se usa para operar wchar_t y el que abre mb. Se utiliza MBCS, etc.
Vale la pena mencionar que un grupo que comienza con _t es una función "adaptativa". En las opciones del proyecto de Visual Studio, puede elegir si desea usar Unicode o codificación de aplicación normal, luego este _t se adaptará automáticamente. a esta opción Por ejemplo, _tcslen ejecutará automáticamente wstrlen cuando la opción sea Unicode y strlen cuando la opción sea codificación ANSI.
Hablemos de las definiciones de tipos de cadenas en la API de Windows. Hay varias comunes
#define?LPSTRchar*
#define?LPCSTR?const ? char*
#define?LPTSTR?TCHAR*
#define?LPCTSTR?const?TCHAR*
#define?LPWSTRwchar_t*
#define?LPCWSTR?const?wchar_t*
Puedes encontrar el patrón si miras con atención. LP es un puntero, la tradición de Microsoft representa una cadena, C representa constante, T representa TCHAR y W. representa wchar_t.
Finalmente, hablemos de TCHAR. Tiene la misma función que _tcslen mencionó anteriormente. Se define así
#ifdef?_UNICODE
#define? TCHARwchar_t
#else
#define?TCHAR?char
#endif
Es decir, se adapta automáticamente según el compilador .
El último y más importante punto es cómo representas las cadenas char y wchar_t en tu programa.
Lo más familiar es incluir comillas a ambos lados de la cadena, lo que indica que la cadena es de tipo char:
LPCSTR?sz?=?"Algunos?caracteres ";
LPCSTR?sz?=?"Algunos?caracteres";
p>
Esto no se puede aplicar a lugares que requieren wchar_t. Por ejemplo, si escribes wprintf (sz), es incorrecto. El compilador informará un error y no podrá convertir de const?char* a const?wchar_t*. Para escribir una cadena de caracteres ancha, debes agregar una L antes de las comillas, como
LPCWSTR?szw?=?L"Wide?characters";
De esta manera, wprintf(szw) será correcto.
Para adaptarse a las necesidades de TCHAR, Microsoft ha definido una macro, _T, que se incluye en la variable string
LPCTSTR?tsz?=?_T("adaptive? caracteres ");
Dicha cadena agregará automáticamente L o no según las opciones del compilador.
Entonces n en esas funciones, como strncpy y otras similares con _s al final, strcpy_s, es otro problema completamente diferente. La razón es que las bibliotecas originales del lenguaje C, como strcpy, pueden provocar fácilmente un desbordamiento del búfer y usted puede escribir fácilmente este tipo de declaraciones
char?sz[5];
strcpy(sz,? "algo?para?copiar");
Esta declaración se compila completamente, pero tiene un problema grave: sz no es lo suficientemente largo para copiar la cadena completa y strcpy no lo sabe, por lo que lo intentará. modificar el contenido más allá del búfer provoca un desbordamiento del búfer. El desbordamiento del búfer es una vulnerabilidad muy común. La biblioteca de lenguaje C original no puede evitar este problema. A veces, cuando acepta la entrada del usuario, no tiene forma de saber cuánto ingresará el usuario. datos.
Porque ahora existen strncpy,?strcpy_s y casi todas las funciones de biblioteca estándar como scanf_s,?gets_s, etc., tienen una o más versiones modificadas. Estas versiones básicamente solo tienen un parámetro más, que es The. tamaño del buffer que le das a esta función. Por ejemplo, en el ejemplo de ahora:
strcpy_s(sz,?5,?"ssdfsfdsfsf");
Cuando este código se ejecuta en la versión de depuración, aparece un Runtime?Error Aparecerá un mensaje emergente y le indicará ¿Buffer?to?small no causará un error en la versión de lanzamiento, pero truncará la cadena que desea copiar al tamaño del búfer para garantizar que no se produzca un desbordamiento del búfer.
Los programas serios recién escritos deben utilizar versiones seguras de funciones. Esto puede entenderse como la abreviatura de seguridad. El compilador de Microsoft ahora emite una advertencia cuando utiliza funciones no seguras como strcpy.
La función con l puede establecer un área de idioma de caracteres y la función sin l utiliza la configuración de idioma predeterminada del sistema operativo.