Come prelevare l'indirizzo di una singola cella in un array di caretteri?

di il
7 risposte

Come prelevare l'indirizzo di una singola cella in un array di caretteri?

Salve a tutti, ho qualche difficoltà con questo esercio il quale chiede:

Definire una funzione che prende in input un arraymonodimensionale di caratteri e restituisce il puntatore alla cellache contiene la prima vocale dello array.

Detto ciò, il codice che ne segue è:

#include <iostream>

using namespace std;

char *func (char a[], int n)
{

 char *p= nullptr;
 

for (int i=0; i<n; i++)
{
	if (a[i]=='a'||a[i]=='o'||a[i]=='i'||a[i]=='e'||a[i]=='u')
	{
		p=&a;
		break;

	}else
	{
		continue;
	}
}

return p;

}


int main()
{	

	
	char v[]={'f','e','r','y','\0'};
	cout << "Il valore di func e:"<< func(v,5)<<endl;
	//" "<<"(verifica)il valore della cella con la prima lettera è:"<< (&v)+2 <<endl;
	return 0;
	
}



Il problema nel codice è (come da titolo) che non mi preleva l'indirizzo della singola cella (in questo caso la 'e') bensì mi stampa tutto l'array ossi 'fery'.
Qualcuno saprebbe dirmi più nel dettaglio dove sbaglio?

7 Risposte

  • Re: Come prelevare l'indirizzo di una singola cella in un array di caretteri?

    Per rimanere nell'ambito del tuo codice, dai un'occhiata a queste modifiche
    
    char *func(char a[], int n)
    {
    
    	char *p = nullptr;
    
    
    	for (int i = 0; i<n; i++)
    	{
    		if (a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'o' || a[i] == 'u')
    		{
    			p = &a[i];
    			break;
    		}
    	}
    
    	return p;
    }
    
    
    int main()
    {
    	char v[] = { 'f','e','r','y','\0' };
    	cout << "Il valore di func e': " << *func(v, 5) << endl;
    
    	return 0;
    }
    
  • Re: Come prelevare l'indirizzo di una singola cella in un array di caretteri?

    Inoltre non ha senso inserire il carattere \0 e contemporaneamente passare alla funzione la dimensione dell'array.
  • Re: Come prelevare l'indirizzo di una singola cella in un array di caretteri?

    Grazie mille oregon, stavo impazzendo.
    Effettivamnte devo restituire un puntatore ed è giusto mettere l'asterisco prima di func.
    adesso mi restituisce 'e' come è giusto che sia.
    Ma mi chiedevo giusto per curiosita in p=&a visto che vi viene posta la "&" e quindi vi è la richiesta del l'indirizzo della cella di memoria (numero esadecimale) come mai *func(v,5) vede la 'e'? in teoria non viene inizializzata la p ad un indirizzo di memoria? non dovrebbe stampare un esedecimale? in tal caso come si protrebbe fare per stampare l'indirizzo di memoria della cella di quell'array di char?
  • Re: Come prelevare l'indirizzo di una singola cella in un array di caretteri?

    Nippolo ha scritto:


    Inoltre non ha senso inserire il carattere \0 e contemporaneamente passare alla funzione la dimensione dell'array.
    se passo a "func" a[] dovrebbe essere già impostasto sul primo carattere ossia la "f" nel ciclo esso continuerà a scorrere tutto l'array di caratteri se non metto il NULL ossia '\0' non dovrebbe verificarsi qualche problema?
  • Re: Come prelevare l'indirizzo di una singola cella in un array di caretteri?

    
    	char *pvoc = func(v, 5);
    	cout << "L'indirizzo e': 0x" << static_cast<void*>(pvoc) << " e corrisponde alla lettera " << *pvoc << endl;
    
    Se non utilizzi la lunghezza dell'array, durante il ciclo ti puoi sempre accorgere del fatto che hai raggiunto il carattere \0 e fermarti.

    Ma dato che l'esercizio non parla esplicitamente di una stringa terminata da NULL, ma di un generico array di caratteri, va bene passare il numero di caratteri.
  • Re: Come prelevare l'indirizzo di una singola cella in un array di caretteri?

    oregon ha scritto:


    
    	char *pvoc = func(v, 5);
    	cout << "L'indirizzo e': 0x" << static_cast<void*>(pvoc) << " e corrisponde alla lettera " << *pvoc << endl;
    
    Se non utilizzi la lunghezza dell'array, durante il ciclo ti puoi sempre accorgere del fatto che hai raggiunto il carattere \0 e fermarti.

    Ma dato che l'esercizio non parla esplicitamente di una stringa terminata da NULL, ma di un generico array di caratteri, va bene passare il numero di caratteri.
    Grazie mille oregon, sei stato molto esaustivo nella spiegazione ora mi è tutto più chiaro.
    Giusto per completezza (siccome sono un pò smanettone ) ho notato che è possibile fare il cast metttendo direttamente l'operatore unario '&' a pvoc. é una forma equivalente a static_cast<void*>?
  • Re: Come prelevare l'indirizzo di una singola cella in un array di caretteri?

    No, è sbagliato.

    pvoc contiene l'indirizzo mentre &pvoc è l'indirizzo dell'indirizzo ovvero un'altra cella di memoria non quella che cerchi
Devi accedere o registrarti per scrivere nel forum
7 risposte