2010-03-19 6 views
22

Quiero hacer un programa que lea un número en el formato de salida y que al igual que esta cadena: si el número es 12345 que debería entonces la salida 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é ?Cómo usar la función string.substr()?

#include <iostream> 
#include <string> 
#include <cstdlib> 
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; 
} 
+1

['atoi' no debería usarse] (http://stackoverflow.com/q/17710018/995714) –

Respuesta

44

Si estoy en lo cierto, el segundo parámetro de substr() debe ser la longitud de la subcadena. ¿Qué hay de

b = a.substr(i,2); 

?

+1

Sí, está incrementando la longitud de la subcadena cada vez. –

+1

+1, buena observación! –

16

Como se muestra here, el segundo argumento de substr es el longitud, no la posición de fin:

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

Generar subcadena

Devuelve un objeto de cadena con su contenido inicializado a 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 se necesita es b = a.substr(i,2);

También debe ser consciente de que su salida será divertido para un número como 12045. Obtendrá 12 20 4 45 debido al hecho de que está utilizando atoi() en la sección de cadena y la salida de ese número entero. Es posible que desee probar simplemente outputing la propia cadena, que se haber dos caracteres:

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

De hecho, toda la cosa podría ser más simple escribir como:

#include <iostream> 
#include <string> 
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; 
} 
2

Otra cuestión interesante variante puede ser:

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

de siguiente 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 << " "; 
    } 
2

Usted puede obtener el resultado anterior usando siguiente código en C

#include<stdio.h> 
#include<conio.h> 
#include<string.h> 
int main() 
{ 
    char *str; 
    clrscr(); 
    printf("\n Enter the string"); 
    gets(str); 
    for(int i=0;i<strlen(str)-1;i++) 
    { 
    for(int j=i;j<=i+1;j++) 
     printf("%c",str[j]); 
    printf("\t"); 
    } 
    getch(); 
    return 0; 
} 
+0

que es exactamente lo que no deberías hacer: http://powerfield-software.com/?p=829 – paxdiablo

2

Posible solución sin utilizar substr()

#include<iostream> 
#include<string> 

using namespace std; 


int main() { 
    string c="12345"; 
    int p=0; 

    for(int i=0;i<c.length();i++) { 
     cout<<c[i]; 
     p++; 

     if (p % 2 == 0 && i != c.length()-1) { 
      cout<<" "<<c[i]; 
      p++; 
     } 
    } 
} 
2

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

Cuestiones relacionadas