Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Visualizzazione Stringa in C++

    Ciao a tutti,

    Allego il codice di un esercizio, dove, dopo aver popolato una matrice 2x2 di caratteri, con una funzione la leggo e ne ricavo una stringa di 4 caratteri.

    Il programma funziona correttamente. Solo che non mi è chiaro quanto segue:
    1) Se con un ciclo leggo i singoli elementi della stringa, ottengo visualizzata la stringa per intero
    2) Se invece faccio una cout della stringa, mi viene visualizzata una sequenza di robe strane.

    Allora la mia domanda è: in C++ è possibile usare una stringa così come è, senza dover passare da un ciclo di lettura cout dei singoli elementi?

    Ho bisogno di chiarirmi con urgenza questo punto, perchè ho la necessità di confrontare degli elementi. Cioè, se ad esempio ho una matrice 2x2 come nel mio caso e una stringa già assegnata di 4 caratteri, creandomi una stringa con gli elementi della matrice posso dire, che so:
    codice:
    if (stringaDaMatrice == miaStringa) etc..
    o questo è sintatticamente scorretto e bisogna usare un altra soluzione?

    Ecco il testo del programma di prova:
    codice:
    #include <iostream>
    using namespace std; 
    #define DIM 2
    void compilaMatrice (char [][DIM], int);
    void creaStringa (char [] [DIM]);
    
    int main()
    {
    	char Matrice2x2[ DIM][DIM];
    	compilaMatrice(Matrice2x2, DIM);
    	cout << "Creo dalla Matrice 2x 2 una stringa lunga 4 caratteri";
    	creaStringa(Matrice2x2);
    
       return 0; 
    }
    
    void compilaMatrice(char mat[][DIM], int dim)
    {
    	cout << "Popolare la Matrice 2x2" << endl;
    	for (int i=0; i<DIM; i++)
    	  	for (int j=0; j<DIM; j++)
    		{
    			cin >> mat[i][j];
    		}
    	return;
    }
    
    void creaStringa (char mat[] [DIM])
    {
    	char tmpStringa [4];
    	int k;
    	k=0;
    	for (int i=0; i<DIM; i++)
    	  	for (int j=0; j<DIM; j++)
    		{
    			tmpStringa[k] = mat [i] [j];
    			k++;
    		}
    	cout << endl;
    	for (int k=0; k<4; k++)
    		cout << tmpStringa[k];
    	cout << endl;
    	cout << tmpStringa;
    	return;
    }
    Spero che qualcuno sia così gentile, come sempre del resto, di darmi una risposta.

    Ciao
    Gaetano

  2. #2
    Allora la mia domanda è: in C++ è possibile usare una stringa così come è, senza dover passare da un ciclo di lettura cout dei singoli elementi?
    Grazie ragazzi, credo d'aver risolto. E' stato sufficiente dichiarare l'array tmpArray di 5 elementi e nell'ultimo aggiungere '/0' .

    Comunque qualunque altro consiglio è il benvenuto.

    Ciao.
    Gaetano

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Pero' non puoi confrontare due stringhe con l'operatore ==

    In quel modo confronti solamente i puntatori con un risultato che non ha nulla a che vedere con quello reale.

    Devi usare la funzione

    strcmp

    Leggine l'uso nell'help

  4. #4
    Grazie lo farò.
    Però, proseguendo e lasciando stare la prima parte del programma, ho modificato questa parte aggiungendo una funzione:

    codice:
    void creaStringhe (char mat[] [DIM])
    {
    	int k;
    	k=0;
    	for (int i=0; i<DIM; i++)
    	  	for (int j=0; j<DIM; j++)
    		{
    			primaStringa[k] = mat [i] [j];
    			k++;
    		}
    	cout << endl;
    	for (int k=0; k<4; k++)
    		cout << primaStringa[k];
    	primaStringa[4] = '\0';
    	cout << endl;
    	cout << primaStringa;
    	// Creo secondaStringa
    	secondaStringa = altreStringhe(primastringa);
    }
    
    char altreStringhe(char tmpstringa[5])
    {
    	tmpStringa[0] = primaStringa[2];
    	tmpStringa[1] = primaStringa[0];
    	tmpStringa[2] = primaStringa[3];
    	tmpStringa[3] = primaStringa[1];
                 tmpStringa[4] = '/0';
        return tmpStringa;
    }
    Cioè in sostanza se ABCD è la prima stringa, io ho bisogno di creare altre 3 stringhe ed esattamente EATR ,TERA eRTAE .

    Pensavo di farlo con una funzione come quella che ho inserito, perchè ho visto che basta operare sulla precedente per ottenere la successiva, ma ho questo errore:
    error C2065: 'primastringa': identificatore non dichiarato
    error C2440: 'return': impossibile convertire da 'char []' a 'char'


    Non so come risolvere. Puoi aiutarmi ?

    Grazie
    Gaetano
    Gaetano

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    error C2065: 'primastringa': identificatore non dichiarato
    In effetti primastringa non e' uan variabile dichiarata ... almeno non nel codice che hai mostrato ...

    Saprai che in C le variabili devono essere dichiarate ...

    error C2440: 'return': impossibile convertire da 'char []' a 'char'
    Stai restituendo una stringa (ovvero un puntatore ad una stringa) mentre la funzione e' dichiarata in modo da restituire un char.

    Tu fai molta confusione tra char e stringhe. In C le stringhe sono array di char e sono rappresentate dal puntatore al primo char.

  6. #6
    Grazie Oregon

    In effetti mi sono accorto anch'io dell'errore.
    Le variabili sono state dichiarate come globali
    char primaStringa[5];
    char secondaStringa[5]; etc..

    Quindi ho corretto il codice così
    codice:
    	cout << primaStringa;
    	// Creo secondaStringa
    	secondastringa = altreStringhe(primaStringa);
    }
    
    char altreStringhe(char Stringa[5])
    {
    	char tmpStringa[5];
    
    	tmpStringa[0] = Stringa[2];
    	tmpStringa[1] = Stringa[0];
    	tmpStringa[2] = Stringa[3];
    	tmpStringa[3] = Stringa[1];
                 tmpStringa[4] = '/0';
    	return tmpStringa;
    }
    e come mi dici faccio confusione fra char e puntatori. Volendo ottenere uno scenario come quello malamente da me illustrato, potresti aiutarmi a correggere l'impostazione del codice ?

    Grazie e ciao
    Gaetano

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    La funzione altreStringhe deve essere dichiarata cosi'

    char *altreStringhe(char *Stringa)

    e al suo interno devi allocare tmpStringa dinamicamente

    P.S. Se devi lavorare con le stringhe e il C, devi almeno avere le basi di conoscenza di tali entita' (e ovviamente dei puntatori ....). E' fondamentale, altrimenti non farai altro che copia-incolla di codice che non comprendi pienamente e questo fatto non e' formativo ...
    E su cio' che non e' formativo, non sono molto d'accordo ...

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.