2011-12-16 31 views
14

Tengo una cadena: "apple". ¿Cómo puedo convertir solo el primer carácter a mayúscula y obtener una nueva cadena en forma de "Apple"?Convertir la primera letra en cadena en mayúscula

También puedo tener una cadena con caracteres multibyte.

¿Qué sucede si el primer carácter de la cadena es un carácter multibyte?

+3

¿Qué idioma se utiliza? –

+0

https://www.google.com/search?q=Title+case+a+string –

+0

El idioma que estoy usando es C++ – user1065276

Respuesta

3

(sólo funciona con personajes ASCII.)

std::wstring s = L"apple"; 

if(islower(s.at(0) <= 'z' ? s.at(0) : 'A')) 
    s[0] += 'A' - 'a'; 

O si se siente de lujo y se siente como torturar a cualquier futuros lectores de su código:

std::wstringstream wss; 
wss << std::uppercase << s[0] 
    << std::nouppercase << s.substr(1); 
wss >> s; 
+0

+1, suponiendo que el C++ era correcto, por supuesto;) –

+0

No puedo usar str [0] porque, puedo tener cadena que tiene caracteres multibyte – user1065276

+0

@downvoters ¿Quieres decirme dónde metí la pata? –

30
string str = "something"; 
str[0] = toupper(str[0]); 

Eso es todo lo que necesitas hacer. También funciona para C strings.

+0

+1 Se olvidó de 'toupper()'. –

+0

¿Quiere decir 'char * str =" algo "; str [0] = toupper (str [0]); 'funcionaría? (como esto es c-string). – Nawaz

+1

@Nawaz no porque eso sería modificar un const char [9] (en la memoria no se puede modificar). Pero si tienes una cadena C en algún recuerdo que tienes, entonces sí, funcionará. –

6

no puedo usar str [0] porque, puede tener cadena que tiene caracteres de varios bytes

que no conozco de cualquier aplicación que soporte CRT clasificación de caracteres no ASCII y conversión. Si desea soportar Unicode, todo es mucho más complicado ya que "convertir el primer carácter a mayúscula" puede no tener sentido en otros idiomas. Tienes que usar un Unicode library escrito por expertos para esto.

Para ilustrar lo complicado que es, considere el siguiente caso en Inglés. La conversión de tres secuencia de código 'archivo' (con f-ligadura) deberá romper el primer punto de código en dos letras separadas que dan como resultado 'Archivo'. Tenga en cuenta que las interfaces C/C++ estándar para hacer la clasificación y conversión de casos no toman en cuenta estos casos, por lo que es incluso imposible implementarlos para que sean compatibles con Unicode correctamente.

3
#include <iostream> 
using namespace std; 

void capitalize (string &s) 
{ 
    bool cap = true; 

    for(unsigned int i = 0; i <= s.length(); i++) 
    { 
     if (isalpha(s[i]) && cap == true) 
     { 
      s[i] = toupper(s[i]); 
      cap = false; 
     } 
     else if (isspace(s[i])) 
     { 
      cap = true; 
     } 
    } 
} 
+0

Perfecto, justo lo que estaba buscando. Esto también toma varias palabras con espacios. – Mateo

5

Al igual que lo que dijo Carneigie,

string str = "something"; 
str[0] = toupper(str[0]); 

pero también recuerda a:

#include <string> 
#include <cctype> 

todo el camino hasta

+0

No entiendo. ¿Por qué tenemos que incluir 'cctype'? Este es un encabezado C, y es una buena práctica quedarse con los encabezados de C++ solo con C++. Además, el código anterior no requiere 'cctype'. ??? – ThatPixelCherry

+0

@ThatPixelCherry También es para C++. http://www.cplusplus.com/reference/cctype/ toupper requiere cctype – HoKy22

+0

¡Oh, guau! Lo siento por eso. Gracias por dejarlo en claro. – ThatPixelCherry

Cuestiones relacionadas