Dubbio funzione std::stoi

di il
13 risposte

Dubbio funzione std::stoi

Salve a tutti ho un problema con questo programma:

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
using namespace std;

ifstream read ("input.txt");
ofstream write ("output.txt");

int main()
{
     string x;
    int y=0;
    bool found=false;
    int j=0;

   for (int i=0; i<3; i++)
    {
        read >> x;
        y=stoi(x);
        j=y;
        found=false;
        while (found=false)
            {
                if(x=="STOP")
                    {
                        write << j;
                        write << '\n';
                        found=true;

                    }else
                    {
                        read >> x;
                        y=stoi(x);
                        if(y<j)
                            {
                                j=y;
                            }
                    }


            }



    }



}

in pratica data in input una sequenza di numeri devo individuare il minore di questi fino all'arrivo della parola STOP

quindi ad esempio
Input.txt
34 32 42 232 STOP
3 22 16 66 4 STOP
43 5 STOP

output.txt
32
3
5


Il problema nel programma è che nonostante io utilizzi la funzione
 stoi 
che dovrebbe convertire le stringhe in numeri (int in questo caso) non vada a buon fine sicuramente qualcosa non va a livello semantico dato che il file di out è vuoto.

13 Risposte

  • Re: Dubbio funzione std::stoi

    Qui

    while (found=false)

    non noti nulla di strano?
  • Re: Dubbio funzione std::stoi

    Ho risolto grazie mille che svista mamma mia... è la prima volta che utilizzo la funzione stoi quindi mi ero principalmente concentrato sul fatto di averla utilizzata male.
    Visto che ci sono vorrei chiedere una cosa, come mai se utilizzo la funzione atoi che dovrebbe avere la stessa funzione di stoi solo per i char mi da un errore di conversione?
  • Re: Dubbio funzione std::stoi

    Perché stoi lavora con un argomento di classe string mentre atoi con un argomento di tipo puntatore a chat.

    Quindi dovresti scrivere

    atoi(x.c_str());

    Vedi la documentazione
  • Re: Dubbio funzione std::stoi

    Ti ringrazio ancora una volta.
    Giusto per completezza, ho provato a fare come dici ( e funziona) ma se volessi prendere in un stringa (che è appunto vista come un'array di caratteri) un solo numero come dovrei fare? ho provato così; dichiarando un puntatore a carattere per prender l'indirizzo di memoria della della cella dove giace il carattere che voglio convertire in int ma niente mi da un errore posto qui il codice:
    
    
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <cstring>
    
    using namespace std;
    
    int main()
    {
        string x="1234890";
        int y=0;
        char *a=&x[0];
    
    
        cout << '\n';
    
        y=atoi (x.c_str(*a)); //ho messo l'asterisco in quanto dovrei ottenere il contenuto del puntatore e non l'indirizzo hex, questa è la riga dove spunta l'errore.
        cout << y<< endl;
    
        return 0;
    }
    
    
    L'errore in questione dice:
    no matching function for call to std::__cxxll::basic_string<char>::c_str(char&)
    sinceramente non riesco a capire.
  • Re: Dubbio funzione std::stoi

    Non ho capito quello che chiedi. Il metodo c_str non ha argomenti e non si usa così.

    Forse volevi scrivere

    atoi(a);

    ma non capisco il perché
  • Re: Dubbio funzione std::stoi

    oregon ha scritto:


    Non ho capito quello che chiedi. Il metodo c_str non ha argomenti e non si usa così.

    Forse volevi scrivere

    atoi(a);

    ma non capisco il perché
    In pratica data una stinga x ad esempio "12344556"
    vorrei poter accedere al carattere 1 quindi x[0] per poi convertirlo in un int visto che "1" è un carattere in teoria si può utilizzare la funzione atoi ma niente, insomma atoi o non atoi non riesco ad accedere ad un elemento di quella stringa per poterla convertia in un int.
  • Re: Dubbio funzione std::stoi

    La funzione atoi converte una stringa terminata da null in numero.

    Se devi convertire un singolo char devi semplicemente convertire i valore ascii (che dovresti conoscere) ovvero

    y = (int)x[0] - '0' ;
  • Re: Dubbio funzione std::stoi

    Quindi mi consigli uno switch dove metto tutti casi da 0 a 9?
    ad esempio visto che 1 equivale ad 49 se spunta 49 metto 1 in y? non c'è una via meno intrinseca?
  • Re: Dubbio funzione std::stoi

    Forse non hai capito cosa fa quella riga
  • Re: Dubbio funzione std::stoi

    oregon ha scritto:


    Forse non hai capito cosa fa quella riga
    dovrebbe fare il cast ad int ma -'0' a cosa serve?
  • Re: Dubbio funzione std::stoi

    A sottrarre il valore ascii del carattere zero in modo che dai valori ascii delle cifre ottieni il corrispondente valore decimale.

    Ma sottrai SEMPRE '0' per qualsiasi elemento di x[]

    Quindi per il ventunesimo carattere

    x[20]-'0';
  • Re: Dubbio funzione std::stoi

    Grazie, ho provato e funziona sinceramente non lo conoscevo questo trick è molto utlile, ma il funzionamento qual'è come è possible che "sottraendo il carattere 0" si ottenga il numero presente nella stringa?. chiedo per curiosità
  • Re: Dubbio funzione std::stoi

    Il problema di voi studenti 'moderni' è che non studiate le basi...

    Questi non sono strani 'trick' ma semplici codici derivanti dal fatto che i caratteri sono memorizzati usando il codice ASCII.
Devi accedere o registrarti per scrivere nel forum
13 risposte