¿Cómo usar la función string.substr ()?

Quiero hacer un progtwig que lea algunos números en formato de cadena y lo muestre de esta manera: si el número es 12345, entonces debería producir 12 23 34 45. Intenté usar la función substr () de la biblioteca de cadenas c ++, pero me da resultados extraños: produce 1 23 345 45 en lugar del resultado esperado. Por qué ?

#include  #include  #include  using namespace std; int main(void) { string a; cin >> a; string b; int c; for(int i=0;i<a.size()-1;++i) { b = a.substr(i,i+1); c = atoi(b.c_str()); cout << c << " "; } cout << endl; return 0; } 

Si estoy en lo correcto, el segundo parámetro de substr() debe ser la longitud de la subcadena. Qué tal si

 b = a.substr(i,2); 

?

Como se muestra aquí , el segundo argumento para substr es la longitud , no la posición final:

string substr ( size_t pos = 0, size_t n = npos ) const;

Generar subcadena

Devuelve un objeto de cadena con su contenido inicializado en una subcadena del objeto actual. Esta subcadena es la secuencia de caracteres que comienza en la posición del personaje pos y tiene una longitud de n caracteres.

Su línea b = a.substr(i,i+1); generará, para valores de i :

 substr(0,1) = 1 substr(1,2) = 23 substr(2,3) = 345 substr(3,4) = 45 (since your string stops there). 

Lo que necesitas es b = a.substr(i,2);

También debe tener en cuenta que su salida se verá divertida para un número como 12045. Obtendrá 12 20 4 45 debido al hecho de que está usando atoi() en la sección de cadena y la salida de ese entero. Es posible que desee intentar solo la salida de la cadena en sí, que tendrá dos caracteres de longitud:

 b = a.substr(i,2); cout < < b << " "; 

De hecho, todo el asunto podría escribirse más simplemente como:

 #include  #include  using namespace std; int main(void) { string a; cin >> a; for (int i = 0; i < a.size() - 1; i++) cout << a.substr(i,2) << " "; cout << endl; return 0; } 

Otra pregunta variante interesante puede ser:

¿Cómo harías "12345" como "12 23 34 45" sin usar otra cuerda?

¿Seguirá el hacer?

  for(int i=0; i < a.size()-1; ++i) { //b = a.substr(i, 2); c = atoi((a.substr(i, 2)).c_str()); cout << c << " "; } 

Puede obtener el resultado anterior usando el siguiente código en c

 #include #include #include int main() { char *str; clrscr(); printf("\n Enter the string"); gets(str); for(int i=0;i 

Posible solución sin usar substr()

 #include #include using namespace std; int main() { string c="12345"; int p=0; for(int i=0;i 

substr(i,j) significa que comienzas desde el índice i (suponiendo que el primer índice sea 0) y tomas los siguientes j caracteres. No significa subir al índice j .