PDA

Visualizza la versione completa : [C] Errore di parsing in funzioni con array


Eris
23-05-2006, 11:28
allora ho questo stupidissimo codice.dato che ancora non ho capito come funzionano le funzioni, i vettori ecc provavo a fare degli esperimenti.
non capisco però perchè mi da errore.non so neanche cosa correggere.potreste aiutarmi
'grazie!


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char maiuscole (char testo);
char minuscole (char testo1);
int main()
{ char s[100];
printf("inserisci una striga qls...\n");

scanf("%s\n",s);
char minuscole (char s);
printf("Tutto in maiuscolo è cosi\n %s ", s);
char maiuscole (char s);
printf("Tutto in minuscolo è cosi\n %s ", s);


system("PAUSE");
return 0;
}

char minuscole (char testo1)
{
tolower (testo1);
return (testo1);}


char maiuscole (char testo)
{ toupper (testo);
return (testo);}

daniele_dll
23-05-2006, 11:55
ok ... ho dato una lettura veloce al codice

il problema è che tu fai un poco di confusione con gli array, per l'appunto :)

gli array sono degli insieme di elementi, ovvero, in questo caso, s corrisponde ad un'insieme di caratteri

ora, a parte che sbagli a passare il tipo alle funzioni, queste possono lavorare soltanto con un singolo carattere per volta non con l'intero array

---

per rendere TUTTO maiuscolo il testo tu devi passare l'intero vettore e specificare nella funzione che ricevi in entrata l'intero vettore/array

quindi

char[] maiuscolo (char[] testo)

in questo modo dichiari che in entrata ricevi un dato e che in uscita ne ricevi un'altro ... ovvero un vettore di caratteri in entrata ed un vettore di caratteri in uscita

dopo di che devi ciclare l'intero vettore tramite un for e applicare la toupper (o tolower) a ogni singolo elemento

ovvero, mettendo che i sia il counter del for
testo[i] = toupper(testo[i]);

e poi alla fine del for

return testo;

in questo modo la funzine ritorna il testo modificato che tu devi acquisire e stampare a video

quindi
char minuscole (char s);
(che era errato in tutto e per tutto)

diventa

s = minuscole(s);

in questo modo la varaibile
s

conterrà il testo in minuscolo

stessa operazione per l'altra funzione e hai finito

andbin
23-05-2006, 12:29
Originariamente inviato da daniele_dll
char[] maiuscolo (char[] testo)

in questo modo dichiari che in entrata ricevi un dato e che in uscita ne ricevi un'altro ... ovvero un vettore di caratteri in entrata ed un vettore di caratteri in uscitaA parte che char[] maiuscolo (char[] testo) è una sintassi sbagliata, quindi:

char* maiuscolo (char testo[])
oppure, come preferisco io:
char* maiuscolo (char *testo)

Sul fatto di restituire un puntatore ... si può discutere fino a domani. In effetti, passando alla funzione un puntatore all'array non ci sarebbe alcun bisogno di "far ritornare" qualcosa.
Se si fa ritornare il puntatore dell'inizio stringa, in genere, lo si fa solo per convenienza se si vuole usare la stringa come argomento di un'altra espressione. Esempio:

printf ("%s\n", maiuscolo (s));


Originariamente inviato da daniele_dll
s = minuscole(s);

in questo modo la varaibile
s

conterrà il testo in minuscoloNota che non puoi usare s come "lvalue". Se s è dichiarato char s[100];, non puoi fare assegnazioni ad s!!!

daniele_dll
23-05-2006, 12:31
Originariamente inviato da andbin
A parte che char[] maiuscolo (char[] testo) è una sintassi sbagliata, quindi:

char* maiuscolo (char testo[])
oppure, come preferisco io:
char* maiuscolo (char *testo)

Sul fatto di restituire un puntatore ... si può discutere fino a domani. In effetti, passando alla funzione un puntatore all'array non ci sarebbe alcun bisogno di "far ritornare" qualcosa.
Se si fa ritornare il puntatore dell'inizio stringa, in genere, lo si fa solo per convenienza se si vuole usare la stringa come argomento di un'altra espressione. Esempio:

printf ("%s\n", maiuscolo (s));

Nota che non puoi usare s come "lvalue". Se s è dichiarato char s[100];, non puoi fare assegnazioni ad s!!!

ma veramente volevo evitare apposta di tirare in ballo i puntatori dato che ha già confusione con i normali vettori :stordita:

inoltre sintatticamente è correttissima la possibilità di ritornare degli array di char ... che poi la cosa sia carina o meno è tutt'altro discorso

oregon
23-05-2006, 12:41
In pratica, condividendo quanto detto dagli altri, tranne per il fatto di non voler tirare in ballo i puntatori, prendi spunto da queste correzioni



#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

void minuscole (char *testo)
{
char *t=testo;
while(*t)
{
*t=tolower(*t);
t++;
}
}

void maiuscole (char *testo)
{
char *t=testo;
while(*t)
{
*t=toupper(*t);
t++;
}
}

int main()
{
char s[100];
printf("inserisci una stringa qls...\n");

fgets(s, 100, stdin);

minuscole(s);
printf("Tutto in minuscolo e' cosi\n %s ", s);

maiuscole(s);
printf("Tutto in maiuscolo e' cosi\n %s ", s);

system("PAUSE");
return 0;
}


I puntatori sono un elemento fondamentale in C/C++ e che va affrontato praticamente all'inizio dello studio. In realta', dato che e' un argomento fortemente legato alle stringhe, e' utilissimo apprenderlo proprio in relazione ad esempi legati alle stringhe.

Ovviamente, IMHO

andbin
23-05-2006, 12:44
Originariamente inviato da daniele_dll
ma veramente volevo evitare apposta di tirare in ballo i puntatori dato che ha già confusione con i normali vettori :stordita: Mah ... guarda, in un buon corso di studio del linguaggio "C" i vettori e i puntatori si studiano assieme ...

Nota che dichiarando nel parametro della funzione char testo[] oppure char *testo, testo è sempre .... (ma guarda caso ;) ) un puntatore!


Originariamente inviato da daniele_dll
inoltre sintatticamente è correttissima la possibilità di ritornare degli array di char ... che poi la cosa sia carina o meno è tutt'altro discorso Nel linguaggio "C" NON si possono far ritornare array!!!! Al massimo puntatori (quindi nel caso di array, un puntatore al primo elemento dell'array).

Eris
23-05-2006, 18:45
umh diciamo che array, funzioni e puntatori proprio non riesco a capirli...

ho letto 200 guide ma niente... :(

oregon
23-05-2006, 19:35
Originariamente inviato da Eris
umh diciamo che array, funzioni e puntatori proprio non riesco a capirli...

Hai detto niente ... il 90% del linguaggio ...


Originariamente inviato da Eris
ho letto 200 guide ma niente... :(

Beh ... allora la vedo dura ...

Insisti ...

Eris
23-05-2006, 22:02
dici?

cosa mi conviene studiare per bene prima?le funzioni?

Eris
25-05-2006, 11:47
#include <stdio.h>
#include <stdlib.h>
#define MAX 50

int main()
{ char lett[MAX]= {'a','b','c','d'};
int n=0;
printf("Scrivi un numero:\n");
scanf("%d",&n);
printf("Hai scritto il num %d che corrisponde alla lett %s\n", n, lett[n+1]);

system("PAUSE");
return 0;
}

per esercitarmi ho provato questo ma non funziona.cosa sbaglio?

Loading