Ecco il mio problema, posto il codice così avete le idee più chiare...
codice:
#include <iostream>
#include <stdlib.h>

using namespace std;

float legginumero();

int main(int argc, char *argv[])
{
  int n;
  char buffer[100]; //buffer è l'array di caratteri in cui memorizzare l'input.
  int opzione;  

  cout << " Benvenuto!" << endl;
  cout << " Prima di accedere al menu, inserisci il numero di vertici del grafo: "; 
  
  cin.getline(buffer,100);//affinché il valore immesso sia solo e soltanto un intero, utilizzo
  n=atol(buffer);         //la funzione atol che converte un vettore di caratteri in un long
  cout << endl;           //restituendo zero se il vettore che legge non è un numero! Nel caso in 
                          //cui si immetta un valore in virgola mobile si prende la parte intera.
  while(n <= 0)
  {
   cout << " Errore! Inserire un numero di nodi che sia maggiore di zero: ";
   cin.getline(buffer,100);
   n=atol(buffer);
   cout << endl;  
  }
  
  cout << " Ti ricordo che i vertici sono indicizzati da 0 a " << n-1;
  cout << endl;
  Grafo G(n);
  
  menu();   
  
  do
  {   
      cin >> opzione;
      
      switch(opzione)
      {
       case(1):
          cout << "\n";
          int v1;
          int v2;
          int w;  
          cout << " Inserisci il primo vertice: ";
          cout<< "  ";
          v1=legginumero();
          cout << endl;           
          cout << " Inserisci il secondo vertice: ";
          v2=legginumero();
          cout << endl;
          cout << " Inserisci il peso dell'arco " << "(" << v1 << "," << v2 << "): ";
          w=legginumero();
          cout << "\n";
          G.inserisci_arco(v1, v2, w);
          cout << " Digita la nuova scelta (menu = 6): ";
          break;
       
       case(2):
          cout << "\n";
          int sorgente;
          cout << " Inserisci il vertice sorgente: ";
          cin >> sorgente;
          cout << endl;
          cout << "\n";
          dijkstra(G, sorgente);
          cout << " Fatto. Digita la nuova scelta (menu = 6): ";
          break;
       
       case(3):
          cout << "\n";
          int sorgente2;
          cout << " Inserisci il vertice sorgente: ";
          cin >> sorgente2;
          cout << endl;
          cout << "\n";
          bellman_ford(G, sorgente2);
          cout << " Fatto. Digita la nuova scelta (menu = 6): ";
          break;
          
       case(4):
          cout << "\n";
          G.stampa_lista_cammini();
          cout << "\n";
          cout << " Digita la nuova scelta (menu = 6): ";
          break;
          
       case(5):
          cout << "\n";
          G.stampa_lista_adiacenza();
          cout << "\n";
          cout << " Digita la nuova scelta (menu = 6): ";
          break;
       
       case(6):
          cout << "\n";
          menu(); 
          break;
       
       case(7):
          break;   
             
       default:
          cout << " Scelta errata. Inserire un valore tra 1 e 5: " << endl;
       }    
  }while(opzione != 7);
  
  system("PAUSE");	
  return 0;
}

float legginumero(){
    
char buffer2[100];
float valore;
int numeri=0;
int punti=0;
int altri_caratteri;
int valido;
int i;
do{
valido=1;
altri_caratteri=0;
cin.getline(buffer2,99);
for(i=0;i<strlen(buffer2);i++)
{
if(buffer2[i]>='0'&&buffer2[i]<='9') 
numeri=1;
if(buffer2[i]=='.')
punti++;
if(!(buffer2[i]>='0'&&buffer2[i]<='9')&&buffer2[i]!='.')
altri_caratteri++;
}
if(numeri&&punti<=1&&!altri_caratteri)
valido=1;
else
valido=0;
if(!valido)
cout<<" Valore non consentito"<<endl;
}while(!valido);


valore=atof(buffer2);
return valore;
}
Dopo aver eseguito l' exe si verifica il seguente problema. Prima di aver immesso un valore compare la scritta :
Inserisci il primo vertice: Valore non consentito

Credo che tutto dipenda dal costrutto do-while...
Come posso fare?
Devo cambiare il ciclo?