Corsi on-line
Chiudi
Newsletter:
  • Seguici su Facebook
  • Seguici su Twitter
  • Seguici su Google+
  • Seguici via RSS
  • Seguici col tuo Smartphone

Puntatori e stringhe

A differenza delle variabili viste fino ad ora, le quali contengono un valore specifico, il valore di una variabile di tipo puntatore è una locazione di memoria; o meglio un puntatore contiene l'indirizzo di un'altra variabile che a sua volta contiene un valore specifico. Questo è uno degli argomenti più ostici della programmazione in C++!!!

Come tutte le altre variabili anche i puntatori hanno bisogno di essere dichiarati, tale dichiarazione va effettuata nella seguente maniera:

(L'articolo continua più sotto...)

tipo_puntatore *nomePuntatore;

è quindi il simbolo * ad identificare un puntatore. La dichiarazione può essere interpretata come nomePuntatore è un puntatore ad una variabile di tipo tipoPuntatore.

Dobbiamo inoltre inizializzare un puntatore; se nella dichiarazione ciò non viene fatto esso assume il valore NULL oppure 0 che corrisponde a non punta a nulla. Facciamo un esempio per spiegare l'uso dei puntatori e il loro uso:

//Uso dei puntatori
#include <iostream>

using namespace std;

int main()
{
   
  int a;     //a è un intero
  int *aPtr; //aPtr è un puntatore ad a    

  a = 7; //assegniamo ad a il valore 7
  aPtr = &a; //assegniamo ad aPtr l'indirizzo di a
  
  cout << "L'indirizzo di a e':  " << &a 
       << "\nIl valore di aPtr e': " << aPtr;
       
  cout << "\n\nIl valore di a e': " << a
       << "\nIl valore puntato da *aPtr e' " << *aPtr
       << endl<<endl;
       
system("PAUSE");
return 0;               
}
L'operatore & è un operatore unario esso restituisce l'indirizzo del suo operando.

L'operatore * è detto operatore di risoluzione del riferimento esso restituisce una copia dell'oggetto a cui punta il suo operando. Quindi quando si dereferenzia un puntatore esso si può utilizzare come se fosse la variabile a cui punta.

Nota: in realtà il nome di un'array non è altro che il puntatore al suo primo elemento!

Abbiamo visto che in C la trattazione di una stringa non era un argomento molto semplice... il C++, con l'uso dei puntatori ed una libreria apposita, semplifica molto la trattazione delle stringhe grazie a funzioni di copia e acquisizione di stringhe, inoltre la stampa è resa più agevole dall'uso dello streaming.

Facciamo ora degli esempi per spiegare l'utilizzo delle funzioni della libreria string.h.

//utilizzo delle funzioni
//strcpy e strncpy
#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    //dichiarazione della stringa x
    char x[] = "Guida al C++ di MrWebMaster";
    //dichiarazione di y e z con relative dimensioni 
    char y[28], z[13];
    
    cout << "La stringa contenuta nell'array x e':\t\t" 
         << x
         << "\n\nCopiamo la stringa x in quella y con strcpy: \t"
         //effettuiamo la copia di x in y
         << strcpy(y,x) << endl << endl;
    //copiamo i primi 12 caratteri di x in z
    strncpy(z, x, 13); 
    //aggiungiamo il carattere terminatore
    z[13] = '\0';      
    cout << "Copia dei primi 12 caratteri di x in z: "
         << z << endl;       
    
    system("PAUSE");
    return 0;
}
strcpy(y,x)
copia ad uno ad uno i caratteri contenuti in x e li pone in y; se y non è abbastanza grande da contenere x allora tronca la stringa.

strncpy(z,x,13)
copia ad uno ad uno i primi 13 caratteri di x e li pone in z.
Logicamente non riesce a copiare il carattere terminatore che va copiato a mano con l'istruzione z[13] = '\0';.

Vediamo ora come unire due stringhe mediante le funzioni strcat e strncat.
La prima funzione unisce il secondo argomento al primo, mentre la seconda funzione unisce i solo i primi n caratteri. Vediamo come:

//utilizzo delle funzioni
//strcat e strncat
#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    //dichiarazione delle stringhe
    char x[] = "Guida al C++ di MrWebMaster";
    char y[80] = "Benvenuti alla ";
    char z[80];

    //copiamo y in z
    strcpy(z, y);
    cout << "La stringa contenuta nell'array x e':" 
	     << x << endl;
    cout << "\nAggiungiamo la stringa x a quella y:\n\t\t\t\t"
         //effettuiamo la concatenazione di x in y
         << strcat(y,x) << endl << endl;

    //aggiungiamo i primi 12 caratteri di x a z
    strncat(z,x,12);      
    cout << "Aggiunta dei primi 12 caratteri di x in z:\n\t\t\t\t" 
         << z << endl << endl;       
    
    system("PAUSE");
    return 0;
}
Nota: è importante verificare che le stringhe destinazione, i primi parametri che si passano alle due funzioni, siano abbastanza grandi da contenere le concatenazioni.

Vediamo ora quelle che sono le funzioni di maggior utilità quando abbiamo bisogno di effettuare dei controlli sulle stringhe, ovvero strcmp e strncmp.
Come al solito la prima confronta la tutta la stringa mentre la seconda funzione solo gli n caratteri specificati, il risultato di tale funzione è 0 se le due stringhe sono uguali. Segue un esempio:

//utilizzo delle funzioni
//strcat e strncat
#include <iostream>
#include <string.h>

using namespace std;

int main()
{
  //dichiarazione delle stringhe
  char s1[] = "Guida al C++ di MrWebMaster";
  char s2[] = "Guida al C++ di MrWebMaster";
  char s3[] = "Guida";
   
  cout << "s1: " << s1 << endl;
  cout << "s2: " << s2 << endl;
  cout << "s3: " << s3 << endl << endl;
   
  //effettuiamo ora le comparazioni
  if (strcmp(s2,s1) == 0)
      cout << "s1 ed s2 sono uguali!" << endl;
  else
      cout << "s1 e' diversa da s2" << endl;

  if (strcmp(s3,s1) == 0)
      cout << "s1 ed s3 sono uguali!" << endl;
  else
      cout << "s1 e' diversa da s3" << endl;

  if (strncmp(s1,s3,5) == 0)
      cout << "s3 ed i primi 5 caratteri di s1 sono uguali!\n\n";
  else
      cout << "s3 ed i primi 5 caratteri di s1 sono diverse\n\n";

  system("PAUSE");
  return 0;
}

Corsi
Corso AJAXCorso AJAX
Applicazioni Web 2.0 basate su AJAX con ASP, ASP.NET e PHP. A partire da 39 €.
Corso ASPCorso ASP
Corso completo per la creazione di siti Web dinamici. A partire da 39 €.
Corso Visual Basic 6Corso Visual Basic 6
Realizzare applicazioni Desktop con VB6. A partire da 39 €.
Sommario
Annunci

Mr.Webmaster

Pubblicità
Chi Siamo
Contattaci
Collabora
Note Legali
© 2003 - 2012 Mr.Webmaster - Il portale dei Webmaster Italiani - Tutti i diritti riservati | Powered by IKIweb Internet Media S.r.l. - PIVA 02848390122