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 din
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
.