Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    37

    Ancora un problema con la gestione delle stringhe

    Ho un altro quesito da sottoporvi.

    Praticamente devo ricevere una stringa in input che contenga anche dei numeri e:

    -sommare i numeri presenti nella stringa
    -creare una cifra composta da tali numeri (ad Es. stringa ----> we34jhu57 ---> cifra = 3457) e sommarla alla somma dei numeri presenti nella stringa.

    ecco il listato che ho elaborato io


    codice:
    //Somma numeri in una stringa
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    int main()
    {
        const int strlenght=20;
        char str[strlenght+1];
        char nod[strlenght+1];
        int somma, j, i, cifra=0;
        cout << "Inserire stringa (max " <<strlenght<< " char) > ";
        cin.getline(str, strlenght);
        somma = 0; j=0; i=0;
        while ('\0'!=str[j])
        {
              if ((str[j]>='0') && (str[j]<='9'))
              {
                 somma += (int)str[j] - (int)'0';
                 nod[i] = str[j];
              }
              j++;
              i++;
        }  
        cifra = (int)nod;
        cout << "La somma dei numeri presenti nella stringa e' :"<< somma << endl;
        cout << "Il numero formato dalle cifre presenti nella stringa e' : " << cifra << endl;
        cout << "La loro somma e' : " << somma + cifra << endl;     
        system("pause");
        return 0;
    }

    l'dea era di creare un'array di appoggio dove inserire sequenzialmente i numeri trovati nella stringa e poi successivamente trasformare l'array in un intero tramite il casting. purtroppo però l'operazione di casting non funziona in modo esatto. Dove sbaglio ?

    Grazie

  2. #2
    hai un po' pasticciato

    codice:
    //Somma numeri in una stringa
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main()
    {
    	
    	const int strlength = 20;
    
    	char str[strlength + 1];
    	char nod[strlength + 1];
    
    	cout << "Inserire stringa (max " <<strlength << " char) > ";
    	cin.getline ( str, strlength );
    
    	int somma = 0;
    	int j = 0;
    	int i = 0;
    
    	while ('\0'!=str[j]) {
    
    		if ((str[j]>='0') && (str[j]<='9')) {
    
    			somma += str[j] - '0';
    			nod[i] = str[j];
    			i++;
    		}
    
    		j++;
    
    	}  
    
    	nod[i] = '\n';
    
    	int cifra = atoi ( nod ) ;
    
    	cout << "La somma dei numeri presenti nella stringa e' :"<< somma << endl;
    	cout << "Il numero formato dalle cifre presenti nella stringa e' : " << cifra << endl;
    	cout << "La loro somma e' : " << somma + cifra << endl;     
    	
    	return (0) ;
    
    }
    ciao
    sergio

  3. #3
    codice:
        cifra = atoi(nod);
    ---EDIT---
    Tardi...
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    più che tardi non è l'unico, l'incremento di i deve essere spostato interno al if ed la stringa nod deve essere opportunamente terminata con '\0'.

    Aggiungo anche che il ciclo, nello spirito C deve essere scritto
    codice:
    	while ( str[j] ) {
    
    		if ( isdigit(str[j]) ) {
    
    			somma += str[j] - '0';
    			nod[i] = str[j];
    			i++;
    		}
    
    		j++;
    
    	}
    altrimenti usa la classe string del c++.
    ciao
    sergio

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    37
    Ok, innanzitutto grazie per la correzione, essendo uno alle prime armi certe funzioni come "atoi" non le conosco, ora mi sono informato, praticamente vediamo se ho capito


    codice:
    while ('\0'!=str[j]) {
    
    		if ((str[j]>='0') && (str[j]<='9')) {
    
    			somma += str[j] - '0';/*in questa fase per il compilatore i numeri      
                                                            estratti sono ancora char giusto ?*/
    			nod[i] = str[j];
    			i++;
    		}
    
    		j++;
    
    }  
    
    nod[i] = '\n';// con questo poni al termine dell'array il carattere '\0'
    int cifra = atoi ( nod ) ;/* atoi non la conoscevo come funzione, trasforma l'array nod da 
                                       string in integer */
    Praticamente io cercavo di fare il casting ed inserire direttamente gli elementi nell'array (sbagliando visto che nod è dichiarato char) invece con questo metodo la conversione a integer avviene alla fine.

    ho capito bene ?

    Grazie !

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.