Substr() out_of_range


#1

La funzione substr() con i file non riesco ad usarla :face_with_raised_eyebrow:
Semplicissimo esempio:

#include
#include
#include
using namespace std;
int main()
{
freopen(“input.txt”,“r”,stdin);
freopen(“output.txt”,“w”,stdout);
string v;
for(int i=0;i<2;i++)
cin>>v[i];
string str=v.substr(0,2);
cout<<str;
}

Input: ciao
Output: niente

Se str=substr(1,1), ricevo il messaggio [terminate called after throwing an instance of ‘std::out_of_range’ what(): basic_string::substr:]

Questo mi crea problemi nel problema Tamburello


#2

Ok, pur non sapendo nel dettaglio l’argomento proverò a spiegare il problema (non uccidetemi se dico bestialità :sweat_smile:).
Quando si dichiara una stinga senza specificarne la lunghezza essa avrà una size (lunghezza) impostata automaticamente a 0, quindi quando nel ciclo for prendi in input il carattere v[i], non accade nulla di fatto, dato che il carattere v[i] è come se non esistesse, essendo al di fuori dei limiti di lunghezza della stringa.
Per risolvere il problema potresti:

  1. Dichiarare v specificando la lunghezza: string v(lunghezza, 'carattere') (dove il carattere 'carattere' verrà messo su tutte le celle della stringa).

  2. Fare un resize della stringa: v.resize(lunghezza).

  3. Molto più semplicemente fare un cin di tutta la stirnga anzichè leggerla carattere per carattere: cin>>v; (legge fino a che non incontra uno spazio o un invio e adatta la lunghezza della stringa automaticamente).

Se vuoi saperne di più sul magico mondo delle stringhe ecco il link della pagina di c++ reference: http://www.cplusplus.com/reference/string/string/


#3

Grazie mille! Ho risolto il problema :+1: