2010-03-19 3 views
22

Voglio creare un programma che leggerà un numero in formato stringa e lo produrrà in questo modo: se il numero è 12345, dovrebbe emettere 12 23 34 45. Ho provato ad usare la funzione substr() della libreria di stringhe C++, ma mi dà strani risultati: emette 1 23 345 45 invece del risultato atteso. Perché ?Come utilizzare la funzione 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' non deve essere utilizzato] (http://stackoverflow.com/q/17710018/995714) –

risposta

44

Se ho ragione, il secondo parametro di substr() dovrebbe essere la lunghezza della stringa. Che dire circa

b = a.substr(i,2); 

?

+1

Sì, sta incrementando la lunghezza della sottostringa ogni volta. –

+1

+1, buona osservazione! –

16

Come mostrato here, il secondo argomento substr è il lunghezza, non la posizione finale:

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

Genera stringa

Restituisce un oggetto stringa con i suoi contenuti inizializzato su una sottostringa dell'oggetto corrente. Questa sottostringa è la sequenza di caratteri che inizia alla posizione di carattere pos e ha una lunghezza di n caratteri.

La linea b = a.substr(i,i+1); genererà, per valori di i:

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

Quello che vi serve è b = a.substr(i,2);

Si dovrebbe anche essere consapevoli del fatto che l'output sarà divertente per un numero come 12045. Otterrai 12 20 4 45 perché stai utilizzando atoi() nella sezione di stringhe e stai emettendo il numero intero. Si potrebbe desiderare di provare solo outputing la stringa stessa che saranno essere due caratteri:

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

In realtà, l'intera cosa potrebbe essere più semplicemente scritta come:

#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

Un'altra questione interessante variante può essere:

Come si può fare "12345" come "12 23 34 45" senza utilizzare un'altra stringa?

Quanto segue?

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

È possibile ottenere l'output sopra utilizzando seguente codice nel 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

Che è esattamente ciò che non dovresti fare_: http://powerfield-software.com/?p=829 – paxdiablo

2

Possibile soluzione senza utilizzare 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 che partono dal indice i (supponendo che il primo indice sia 0 e riprenda i caratteri successivi. Non significa andare su indice j.