c++ - length - ¿Cómo obtener la cantidad de caracteres en std:: string?
strlen c++ (11)
¿Cómo debo obtener la cantidad de caracteres en una cadena en C ++?
Al tratar con cadenas de C ++ (std :: string), está buscando length() o size() . Ambos deberían proporcionarle el mismo valor. Sin embargo, cuando se trata de cadenas C-Style, debe usar strlen() .
#include <iostream>
#include <string.h>
int main(int argc, char **argv)
{
std::string str = "Hello!";
const char *otherstr = "Hello!"; // C-Style string
std::cout << str.size() << std::endl;
std::cout << str.length() << std::endl;
std::cout << strlen(otherstr) << std::endl; // C way for string length
std::cout << strlen(str.c_str()) << std::endl; // convert C++ string to C-string then call strlen
return 0;
}
Salida:
6
6
6
6
Depende de qué tipo de cadena estés hablando. Hay muchos tipos de cadenas:
-
const char*
- una cadena multibyte estilo C -
const wchar_t*
- una cadena ancha estilo C -
std::string
- una cadena multibyte "estándar" -
std::wstring
- una cadena ancha "estándar"
Para 3 y 4, puede usar los .size()
o .length()
.
Para 1, puede usar strlen()
, pero debe asegurarse de que la variable de cadena no sea NULL (=== 0)
Para 2, puede usar wcslen()
, pero debe asegurarse de que la variable de cadena no sea NULL (=== 0)
Hay otros tipos de cadenas en bibliotecas C ++ no estándar, como CString
de MFC, CComBSTR
de ATL, CComBSTR
ACE, etc., con métodos como .GetLength()
, y así sucesivamente. No puedo recordar los detalles de todos ellos directamente de mi cabeza.
Las bibliotecas de STLSoft han abstraído todo esto con lo que llaman calzas de acceso a cuerdas , que se pueden usar para obtener la longitud de la cuerda (y otros aspectos) de cualquier tipo. Por lo tanto, para todo lo anterior (incluidos los de la biblioteca no estándar) utilizando la misma función que stlsoft::c_str_len()
. Este artículo describe cómo funciona todo, ya que no es del todo obvio o fácil.
En C ++ std :: string, el método length () y size () te da el número de bytes, ¡ y no necesariamente el número de caracteres! ¡Lo mismo con la función c-Style sizeof ()!
Para la mayoría de los caracteres imprimibles de 7 bits ASCII, este es el mismo valor, pero para los caracteres que no son 7bit-ASCII definitivamente no lo es. Consulte el siguiente ejemplo para obtener resultados reales (64 bits de Linux).
No hay una función c / c ++ simple que realmente pueda contar el número de caracteres. Por cierto, todo esto depende de la implementación y puede ser diferente en otros entornos (compilador, win 16/32, linux, embedded, ...)
Ver el siguiente ejemplo:
#include <string>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
/* c-Style char Array */
const char * Test1 = "1234";
const char * Test2 = "ÄÖÜ€";
const char * Test3 = "αβγ𝄞";
/* c++ string object */
string sTest1 = "1234";
string sTest2 = "ÄÖÜ€";
string sTest3 = "αβγ𝄞";
printf("/r/nC Style Resluts:/r/n");
printf("Test1: %s, strlen(): %d/r/n",Test1, (int) strlen(Test1));
printf("Test2: %s, strlen(): %d/r/n",Test2, (int) strlen(Test2));
printf("Test3: %s, strlen(): %d/r/n",Test3, (int) strlen(Test3));
printf("/r/nC++ Style Resluts:/r/n");
cout << "Test1: " << sTest1 << ", Test1.size(): " <<sTest1.size() <<" sTest1.length(): " << sTest1.length() << endl;
cout << "Test1: " << sTest2 << ", Test2.size(): " <<sTest2.size() <<" sTest1.length(): " << sTest2.length() << endl;
cout << "Test1: " << sTest3 << ", Test3.size(): " <<sTest3.size() << " sTest1.length(): " << sTest3.length() << endl;
return 0;
}
El resultado del ejemplo es este:
C Style Results:
Test1: ABCD, strlen(): 4
Test2: ÄÖÜ€, strlen(): 9
Test3: αβγ𝄞, strlen(): 10
C++ Style Results:
Test1: ABCD, sTest1.size(): 4 sTest1.length(): 4
Test2: ÄÖÜ€, sTest2.size(): 9 sTest2.length(): 9
Test3: αβγ𝄞, sTest3.size(): 10 sTest3.length(): 10
La forma más sencilla de obtener la longitud de la cadena sin molestar por el espacio de nombres estándar es la siguiente
cuerda con / sin espacios
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
getline(cin,str);
cout<<"Length of given string is"<<str.length();
return 0;
}
cadena sin espacios
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
cin>>str;
cout<<"Length of given string is"<<str.length();
return 0;
}
Podría ser la forma más fácil de ingresar una cadena y encontrar su longitud.
// Finding length of a string in C++
#include<iostream>
#include<string>
using namespace std;
int count(string);
int main()
{
string str;
cout << "Enter a string: ";
getline(cin,str);
cout << "/nString: " << str << endl;
cout << count(str) << endl;
return 0;
}
int count(string s){
if(s == "")
return 0;
if(s.length() == 1)
return 1;
else
return (s.length());
}
Si está utilizando cadena antigua tipo C en lugar de las cadenas más recientes estilo STL, existe la función strlen
en la biblioteca de tiempo de ejecución C:
const char* p = "Hello";
size_t n = strlen(p);
para un objeto de cadena real:
yourstring.length();
o
yourstring.size();
si está usando std :: string, hay dos métodos comunes para eso:
std::string Str("Some String");
size_t Size = 0;
Size = Str.size();
Size = Str.length();
si está utilizando la cadena de estilo C (usando char * o const char *), puede usar:
const char *pStr = "Some String";
size_t Size = strlen(pStr);
Si está usando std::string
, call length()
:
std::string str = "hello";
std::cout << str << ":" << str.length();
// Outputs "hello:5"
Si está utilizando una cadena de caracteres, llame a strlen()
.
const char *str = "hello";
std::cout << str << ":" << strlen(str);
// Outputs "hello:5"
O, si le gusta usar cadenas de estilo Pascal (o f ***** cadenas como a Joel Spolsky le gusta llamarlas cuando tienen un NULL final), simplemente desreferencia al primer carácter.
const char *str = "/005hello";
std::cout << str + 1 << ":" << *str;
// Outputs "hello:5"
std::string str("a string");
std::cout << str.size() << std::endl;
string foo;
... foo.length() ...
.length y .size son sinónimos, solo creo que "length" es una palabra ligeramente más clara.