Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C++]Array di stringhe

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    31

    [C++]Array di stringhe

    E' possibile in C++ creare un array di stringhe?
    Del tipo:
    array[] = {'str1', 'str2', 'str3', ... ,'strN'}

    Col pascal basta scrivere
    type vettore = array[1..5] of string;

    ...ma in C++?

    Grazie in anticipo per l'aiuto

  2. #2
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Se parliamo di char* così

    codice:
    char* strs[]={'str1', 'str2', 'str3', ... ,'strN'};
    però con C++ ci sarebbe anche la stringa del STL, che sia un po più facile da usare, mai come con Pascal .

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    31
    Originariamente inviato da neroux
    Se parliamo di char* così

    codice:
    char* strs[]={'str1', 'str2', 'str3', ... ,'strN'};
    però con C++ ci sarebbe anche la stringa del STL, che sia un po più facile da usare, mai come con Pascal .
    Quindi teoricamente potrei fare così?
    codice:
    char* strs[N];
    for (i = 1; i <= N; i++) {
         cout << "Inserire stringa";
         cin >> strs[i];
    }

  4. #4
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Provalo - io farò un po fatica adesso senza C compiler

    però con C - e normalmente gli altri linguaggi con la sintassi di C - l'indice inizia da 0, quindi
    codice:
    for (i = 0; i < N; i++)

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    31
    Originariamente inviato da neroux
    però con C - e normalmente gli altri linguaggi con la sintassi di C - l'indice inizia da 0, quindi
    codice:
    for (i = 0; i < N; i++)
    Giuro che questa la sapevo xD è la forza di abitudine al Pascal xD

    Cooooomunque... non va..
    Senti, ti posto il listato di quella sottospecie di programma che vorrei fare, eccolo:
    codice:
    #include <iostream>
    #include <string>
    #define N 2 //numero di valori degli arrays
    
    using namespace std;
    
    main(int argc, char argv[]){
    
    	int i;
    	float temp[N], m = 0;
    	char* city[N]; //array che dovrebbe contenere le stringhe
    
    	//ciclo per il popolamento dei vettori
    	for (i = 0; i <= N; i++) {
    		cout << "Inserire citta'\n";
    		cin >> city[i];
    
    		cout << "Inserire temperatura\n";
    		cin >> temp[i];
    
    		m = m + temp[i]; //somma temperature
    	}
    		
    	m = m/N; //calcolo media
    	
    	cout << "La temperatura media e': " << m;
    	
    	cin;	
    
    }
    Questo è il listato con la modifica che mi hai detto tu; lo compila, ma appena inserisco il secondo valore dell'array temp[] l'esecuzione crasha.
    Invece, come l'avevo fatto io (cambia solo che al posto di char* c'era string), l'esecuzione crashava quando inserivo il terzo valore dell'array city[].
    Idee?

  6. #6
    Ovvio che va in crash, cerchi di memorizzare dei caratteri in posti a caso in memoria (city è un vettore di puntatori non inizializzati)... Una possibilità è fare qualcosa del genere:
    codice:
    char city[N][200];
    per cui crei un array di N stringhe da 200 caratteri ciascuna; a quel punto però io eviterei di usare cin >> city[i], dal momento che non controlla la lunghezza della stringa e può sforare dal buffer. Usa piuttosto il metodo getline.
    Il metodo in assoluto più semplice però è l'uso della classe STL string:
    codice:
    std::string city[N];
    Il crash che dicevi che avveniva in questo caso dipende dal fatto che hai impostato il ciclo in questa maniera:
    codice:
    	for (i = 0; i <= N; i++)
    , mentre deve essere
    codice:
    	for (i = 0; i < N; i++)
    , dal momento che l'ultimo elemento dei due array è N-1.
    In ogni caso prima di andare avanti consiglio a tutti e due di studiare approfonditamente come funzionano le stringhe C, dato che anche solo pensare che il codice
    codice:
    char* strs[N];
    for (i = 1; i <= N; i++) {
         cout << "Inserire stringa";
         cin >> strs[i];
    }
    possa funzionare indica che non avete capito assolutamente come funzionano le stringhe C.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Originariamente inviato da Whistler
    Giuro che questa la sapevo xD è la forza di abitudine al Pascal xD
    Ormai tanto tempo che non uso più Pascal, peccato

    Originariamente inviato da Whistler
    lo compila, ma appena inserisco il secondo valore dell'array temp[] l'esecuzione crasha.
    Il problema è che assegni i dati ad un char* senza aver allocato la memoria prima.

    Originariamente inviato da Whistler
    (cambia solo che al posto di char* c'era string), l'esecuzione crashava quando inserivo il terzo valore dell'array city[].
    Idee?
    C'è ancora <= N, come l'indice inizia da zero deve essere <N


    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    31
    MItaly, guarda, la mia era una simplice rischiesta d'aiuto, non c'è bisogno di mettersi al di sopra
    ("[...]dato che anche solo pensare che il codice possa funzionare indica che non avete capito assolutamente come funzionano le stringhe C."); alla fin fine io sto imparando, e credo mi siano ancora concessi errori del genere..

    Cooomunque.. Molte grazie per l'aiuto ad entrambi, ora il programmino sembra funzionare

    Ah, un'ultima cosa, per comparare due stringhe in C++ si fa sempre con a funzione strcmp() del C o in qualche altro modo? (magari direttamente :P)

  9. #9
    Utente di HTML.it L'avatar di neroux
    Registrato dal
    Aug 2009
    Messaggi
    1,973
    Originariamente inviato da Whistler
    Ah, un'ultima cosa, per comparare due stringhe in C++ si fa sempre con a funzione strcmp() del C o in qualche altro modo? (magari direttamente :P)
    Per le stringhe plain di C (che alla fine sono solo un array di caratteri e non proprio un tipo stringa) si fa con strcmp(). Per una stringa del STL ci sia anche il metodo compare().

    www.sitemeer.com » Quando un sito pare irraggiungibile

    Se ti piace ci puoi trovare anche su Facebook

  10. #10
    Originariamente inviato da Whistler
    MItaly, guarda, la mia era una simplice rischiesta d'aiuto, non c'è bisogno di mettersi al di sopra
    ("[...]dato che anche solo pensare che il codice possa funzionare indica che non avete capito assolutamente come funzionano le stringhe C."); alla fin fine io sto imparando, e credo mi siano ancora concessi errori del genere..
    Non mi sto mettendo sopra a nessuno, sto constatando che non si sono comprese né le stringhe C né i puntatori, visto che l'errore è madornale; di conseguenza consiglio di ristudiarle per bene prima di proseguire. In particolare, sconsiglio fortemente di utilizzare fin da subito le stringhe C++, perché in molti casi si devono comunque usare le stringhe C e se non le si è comprese a fondo si rischia di fare grossi pasticci.
    Ah, un'ultima cosa, per comparare due stringhe in C++ si fa sempre con a funzione strcmp() del C o in qualche altro modo? (magari direttamente :P)
    Per le stringhe STL basta usare i normali operatori di confronto (==, !=, <, <=, >, >=), dal momento che la classe basic_string ne effettua l'overload.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.