Come usare la funzione string.substr ()?

Voglio fare un programma che leggerà un certo numero in formato stringa e lo produrrà in questo modo: se il numero è 12345 dovrebbe uscire 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é ?

#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; } 

Se sono corretto, il secondo parametro di substr() deve essere la lunghezza della sottostringa. Che ne dite di

 b = a.substr(i,2); 

?

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

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

Genera sottostringa

Restituisce un object stringa con il suo contenuto inizializzato su una sottostringa dell’object corrente. Questa sottostringa è la sequenza di caratteri che inizia in posizione di carattere pos e ha una lunghezza di n caratteri.

La tua linea b = a.substr(i,i+1); genererà, per i 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 di cui hai bisogno è b = a.substr(i,2);

Dovresti anche essere consapevole del fatto che il tuo output sembrerà divertente per un numero come 12045. Otterrai 12 20 4 45 causa del fatto che stai usando atoi() sulla sezione di stringhe e che emetti quel numero intero. Potresti voler provare a generare la stringa stessa che sarà lunga due caratteri:

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

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

 #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; } 

Un’altra interessante variante può essere:

Come faresti "12345" come "12 23 34 45" senza usare un’altra stringa?

Farà seguito?

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

È ansible ottenere l’output di cui sopra utilizzando il seguente codice in c

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

Possibile soluzione senza usare substr()

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

substr(i,j) significa che si inizia dall’indice i (assumendo che il primo indice sia 0) e si prendano i successivi caratteri j . Non significa andare fino all’indice j .