• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Void e parametri

kodibi

Nuovo utente
Autore del topic
8 Febbraio 2016
8
0
Miglior risposta
0
Ragazzi buonasera, forse buonanotte visto l'orario. Ho un piccolo codice da sviluppare (completato anche se vogliamo) ma manca l'output finale.
La traccia è questa: Sviluppare una function C che, data come parametro di input una stringa che rappresenta un testo in italiano, determina e restituisce come parametri di output la parola di lunghezza massima contenuta nel testo e la sua lunghezza. Nel testo le parole sono separate da un unico spazio.
La Void che ho scritto funziona e calcola il massimo così come la parola più grande solo che non ritorna al main. Qual'è il problema?
scusate per i vari printf inutili ma servivano per capire come procedeva l'algoritmo.

#include <stdio.h>#include <stdlib.h>


void massimo(char testo[],char* parolamax, int* lunghezzamax)
{
char *token,separatori[]={',',' '};
int m;
//char *parolamax;
token=strtok(testo,separatori);
m=strlen(token);
printf("la m temporanea e'%d\n", m);
lunghezzamax=m;
printf("la lunghezzamax temporanea e'%d\n", lunghezzamax);
parolamax=token;
printf("la parola temp max e' %s\n", parolamax);
while(token=strtok('\0',separatori))
{
printf("la m temporanea e'%d\n", m);
m=strlen(token);
if (m>lunghezzamax)
{
lunghezzamax=m;
printf("la lunghezzamax temporanea e'%d\n", lunghezzamax);
parolamax=token;
printf("la parola temporanea e'%s\n", parolamax);
}




}
printf("la lunghezza e'%d\n", lunghezzamax);


printf("la parola e'%s\n", parolamax);
}


int main()
{


int lunghezzamax=0;
char *parolamax;
char testo[100];
gets(testo);
massimo(testo,&parolamax,&lunghezzamax);


printf("il max e' %d\n", lunghezzamax);
printf("la parola piu' lunga e' %c\n", parolamax);
return 0;
}
 
I problemi sono diversi. Principalmente sono legati ai puntatori. Il problema più semplice da risolvere è l'assegnazione degli interi nella funzione:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
Mentre per la copia della stringa devi fare questo procedimento per ogni carattere. Però, visto che ne hai la possibilità, puoi utilizzare
Perfavore, Entra oppure Registrati per vedere i Link!
:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!

Poi hai la dichiarazione implicita di string.h:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!

Sopratutto stai passando un "doppio puntatore" a char nel main alla tua funzione. Dichiara invece:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
Controlla bene i tipi e noterai che adesso sono corretti. Oltre a passare i tipi errati alla funzione, parolamax era un puntatore senza memoria allocata ad esso.

Infine, gets() è una funzione deprecata.

Utilizzare un compilatore aggiornato e possibilmente con tutti i flag di errore attivi permette di correggere questi e molti altri errori.
 
#include <stdio.h>#include <stdlib.h>


void massimo(char testo[], char *parolamax, int *lunghezzamax)
{
char *token,separatori[]={',',' '};
int m;


token=strtok(testo,separatori);
m=strlen(token);
*lunghezzamax=m;


parolamax=token;
printf("La parola temp e'%s\n", parolamax);


while(token=strtok('\0',separatori))
{


m=strlen(token);
if (m>*lunghezzamax)
{
*lunghezzamax=m;
parolamax=token;
printf("La parola temp e'%s\n", parolamax);


}




}
printf("sono nel void la lunghezza e'%d\n", *lunghezzamax);
printf("sono nel void la parola e'%s\n", parolamax);
}


int main()
{


int lunghezzamax=0;
char *parolamax;
char testo[100];
printf("Inserisci la frase\n");
gets(testo);
massimo(testo,&parolamax,&lunghezzamax);


printf("il max e' %d\n", lunghezzamax);
printf("la parola piu' lunga e' %s\n", parolamax);
return 0;

Allora questo è il mio codice aggiornato, ma non ho capito ancora bene una cosa. (per il momento ora passa anche la lunghezza :emoji_slight_smile: ). Quando dici gets() è deprecato, cosa intendi?
per quanto riguarda la dichiarazione che mi hai consigliato, non ho capito cosa dichiaro con quella variabile char.
La strncpy perchè dovrei utilizzarla?
La dichiarazione implicita di <string.h>?
Perdonami ma sono alle prime armi.
Ultima cosa, con questo codice non mi passa la parolamax al main, come devo risolvere? Grazie per il tuo aiuto !
 
Allora questo è il mio codice aggiornato, ma non ho capito ancora bene una cosa. (per il momento ora passa anche la lunghezza :emoji_slight_smile: ). Quando dici gets() è deprecato, cosa intendi?
per quanto riguarda la dichiarazione che mi hai consigliato, non ho capito cosa dichiaro con quella variabile char.
La strncpy perchè dovrei utilizzarla?
La dichiarazione implicita di <string.h>?
Perdonami ma sono alle prime armi.
Ultima cosa, con questo codice non mi passa la parolamax al main, come devo risolvere? Grazie per il tuo aiuto !
Sapendo che sei un principiante provo a dare una spiegazione più dettagliata. :emoji_slight_smile:

Quando dici gets() è deprecato, cosa intendi?
La funzione
Perfavore, Entra oppure Registrati per vedere i Link!
prende legge da console (stdin) finché non vai a capo o si arriva al end-of-file (EOF). Il problema è il seguente: se dichiaro char str[100] e leggo una stringa più lunga di 100 caratteri vai in
Perfavore, Entra oppure Registrati per vedere i Link!
. In pratica stai scrivendo sul resto dello stack, andando a sovrascrivere altri valori e/o creando un segmentation fault (il programma crasha).

Deprecato vuol dire che il suo uso è obsoleto e sconsigliato. A nota informativa, dallo standard C del 2011 è stata anche rimossa (ma rimane per retrocompatibilità in molte implementazioni).

Una versione alternativa più sicura è usare
Perfavore, Entra oppure Registrati per vedere i Link!
:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!

La strncpy perchè dovrei utilizzarla?
Per copiare una stringa in un'altra. Letteralmente tutti i caratteri da un array di caratteri sorgente a uno di destinazione. L'assegnazione che hai fatto tu:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
Fa sì che parolamax punti al primo carattere della stringa token. Peccato che man mano che esegui il
Perfavore, Entra oppure Registrati per vedere i Link!
la stringa token viene modificata e di conseguenza il puntatore parolamax. Quello che vuoi è invece una copia della stringa, che fa
Perfavore, Entra oppure Registrati per vedere i Link!
.

Se non ti è ancora chiaro magari ti serve una rilettura sul funzionamento dei puntatori, argomento sempre e comunque ostico per chi inizia con C/C++.

La dichiarazione implicita di <string.h>?
Nel tuo codice non includi l'header string.h, andando a usare però le funzioni di quella libreria. Includila all'inizio del sorgente insieme alle altre due:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!

Con questo codice non mi passa la parolamax al main, come devo risolvere?
Perché ha l'ultima occorrenza della stringa token ritornata dalla funzione strtok(). La documentazione dice che ritorna NULL alla fine, quindi parolamax suppongo che punti a NULL (non stampando quindi nulla).

Vario
  • La chiamata alla funzione massimo() è ancora errata. La versione corretta è:
    PHP:
    Perfavore, Entra oppure Registrati per vedere i codici!
    Perché parolamax è già un puntatore a char.
  • La definizione (e inizializzazione) di parolamax è errata. Devi definire una dimensione per la parola da memorizzare, ad esempio:
    PHP:
    Perfavore, Entra oppure Registrati per vedere i codici!
    Ci sono certamente soluzioni più eleganti per la costante 50.
  • Nel ciclo while è suggerito l'uso di doppia parentesi visto che esegui un'assegnazione nella condizione:
    PHP:
    Perfavore, Entra oppure Registrati per vedere i codici!