Vettore di Stringhe

di il
3 risposte

Vettore di Stringhe

Salve, ho realizzato questo programma che funziona correttamente, però non so se ho scritto nel modo più opportuno le dichiarazioni di funzioni.
Ovvero, io so che quando devo passare un vettore ad una funzione gli devo passare l'indirizzo al primo elemento del vettore, e nella dichiarazione della funzione devo puntare a quell' indirizzo.
In questo programma invece ho utilizzato un vettore di stringhe ,e quindi penso che debba passare alla funzione l'indirizzo della prima striga del vettore di stringhe &Vett[0][0] (oppure Vett) e poi nella dichiarazione puntare alla prima stringa quindi char Vett[][], tuttavia se scrivo così la dichiarazione della funzione il compilatore mi segnala un errore , ho risolto scrivendo char Vett[DIM][LEN] ma non capisco il motivo.
/*Leggere da tastiera un vettore di n stringhe.
Calcolare la lunghezza della stringa piu’ piccola tra le stringhe inserite.
Stampare a video la stringa corrispondente.
Proporre una soluzione organizzata in almeno 4 funzioni inclusa la funzione main.*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIM 5
#define LEN 15

void LeggereVettoreDiStringheDaTastiera(char Vett[DIM][LEN]);
void ScrivereLunghezzaStringhe(char Vett[DIM][LEN], int Lenght[DIM]);
int TrovaStringaPiuCorta(int Lenght[DIM]);
void StampaStringaPiuCorta(int i, char Vett[DIM][LEN]);

int main(void){
	char Vett[DIM][LEN];
	int Lenght[DIM];
	int i;

	LeggereVettoreDiStringheDaTastiera(Vett);
	ScrivereLunghezzaStringhe(Vett, Lenght);
	i = TrovaStringaPiuCorta(Lenght);
	StampaStringaPiuCorta(i,Vett);

	system("pause");
	return 0;
}

void LeggereVettoreDiStringheDaTastiera(char Vett[DIM][LEN]){
	int i = 0;
	while (i < DIM){
		printf("Inserisci %d-esimo elemento del Vettore di Stringhe: ",i);
		scanf("%s",Vett[i]);
		i++;
	}
	return;
}

void ScrivereLunghezzaStringhe(char Vett[DIM][LEN], int Lenght[DIM]){
	int i = 0;
	while(i < DIM){
		Lenght[i] = strlen(Vett[i]);
		i++;
	}
	return;
}

int TrovaStringaPiuCorta(int Lenght[DIM]){
	int i = 0;
	int pos;
	int min = Lenght[i];
	while (i < DIM){
		if (min > Lenght[i]){
			min = Lenght[i];
			pos = i;
		}
		i++;
	}
	return pos;
}

void StampaStringaPiuCorta(int i, char Vett[DIM][LEN]){
	printf("stringa piu' corta: %s\n",Vett[i]);

	return;
}

3 Risposte

  • Re: Vettore di Stringhe

    Se non gli specifichi le dimensioni, come fa il compilatore a calcolarsi correttamente gli offset? L'unica dimensione che puoi omettere scrivendo [ ] è la prima
  • Re: Vettore di Stringhe

    Ma [DIM] nella dichiarazione della funzione non serve perché nella funzione vado a scrivere
    while (i < DIM) ??
    se scrivo char Vett[][LEN] non dovrebbe puntare all'ultimo elemento della prima stringa?
    e perché negli array monodimensionali si punta invece al primo elemento? es: int funzione (int vett) ?
  • Re: Vettore di Stringhe

    Scrivere
    void fun_1(int v[]);
    equivale a
    void fun_1(int *v);
    dove fun_1() si aspetta un puntatore ad una variabile intera (a tal proposito ci tengo a precisare che non sei costretto a passare a fun_1() l'indirizzo del primo elemento di un array dichiarato per esempio nel main(), puoi passargli anche quello del terzo o tredicesimo elemento).

    Similmente
    void fun_2(int m[][15]);
    equivale a
    void fun_2(int (*m)[15]);
    dove fun_2() si aspetta un puntatore ad un array di 15 interi (questo il motivo per cui nella scrittura m[M][N], la dimensione M può essere omessa).

    Quindi nel momento in cui abbiamo una funzione che deve ricevere un array di M stringhe (alla C), ossia un array di M array di N char ciascuno, il prototipo sarà
    void fun_3(char (*m)[N]);
    o equivalentemente
    void fun_3(char [][N]);
    o
    void fun_3(char [M][N]);
Devi accedere o registrarti per scrivere nel forum
3 risposte