Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260

    [C]Dare in pasto ad una funzione un array di caratteri

    Salve ragazzi,
    ho un problemone abbastanza comune tra neofiti credo, che però non riesco a risolvere.
    Praticamente ho una funzione che mi converte in maiuscolo la prima lettera di una parola, se questa è minuscola, altrimenti la lascia inalterata.
    codice:
    void convertiMaiuscola(char string[]){
         int i, l;
         l = strlen(string);
         for(i=0; i<1; i++){
               if(string[i]>=97&&string[i]<=122) //la prima lettera e' minuscola?
              {
    	string[i] = string[i]-32; //si lo e', fa questo
              }
               else{
                     printf("\nLa lettera e' gia' maiuscola!\n");
               }
          }
          printf("%s", string);
    }
    Se io voglio dargli in pasto una parola contenuta in un array "char nome[15]" e fargli eseguire la funzione come mi devo comportare?
    Dove poi andrò ad usare la funzione devo scrivere

    convertiMaiuscola(nome)???

    Scusate la domanda se banale

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Gli passi un puntatore:

    codice:
    void convertiMaiuscola(char* string)

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260
    Cioè scusa non ho capito, io ho la mia funzione e per chiamarla con un array (ad esempio "nome") come devo fare?
    Devo scrivere semplicemente

    void convertiMaiuscola(char* cognome)

    e la funzione mi parte e mie elabora la stringa cognome?

  4. #4
    Originariamente inviato da Fix87
    Dove poi andrò ad usare la funzione devo scrivere

    convertiMaiuscola(nome)
    Esattamente. Quando tu passi un parametro ad una funzione, il corpo della funzione viene avviato con i suoi argomenti inizializzati con i parametri che gli passi.
    Originariamente inviato da Who am I
    Gli passi un puntatore:

    codice:
    void convertiMaiuscola(char* string)
    In un argomento di funzione char* string e char string[] sono la stessa identica cosa.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260
    codice:
    Esattamente. Quando tu passi un parametro ad una funzione, il corpo della funzione viene avviato con i suoi argomenti inizializzati con i parametri che gli passi.
    Allora avevo capito il funzionamento, l'unico problema è che non mi funziona!

    Praticamente quando vado a compilare mi da questo errore qua:

    warning: conflicting types for 'convertiMaiuscola'
    note: previous implicit decvlaration of 'convertiMaiuscola' was here

    Cha diamine significa????

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260
    Non ci posso credere, ho spostato la funzione prima del testo di dove poi verrà usata e ora funziona. Cioè se la scrivo dopo di quando la chiamo il compilatore non la vede???

    C'è un modo per far si che il compilatore vede le funzione anche alla fine del codice per esempio?

  7. #7
    In C è necessario dichiarare le funzioni prima di poterle utilizzare, mentre suppongo che tu abbia provato a chiamare convertiMaiuscola prima di averla definita:
    Originariamente inviato da Fix87
    warning: conflicting types for 'convertiMaiuscola'
    vuol dire che "convertiMaiuscola" è stata dichiarata più volte, in maniera diversa, e
    note: previous implicit declaration of 'convertiMaiuscola' was here
    indica dove è stata dichiarata la prima volta; nello specifico, dice "implicit" declaration, ovvero ti indica che il compilatore ha visto che hai provato a chiamare convertiMaiuscola prima che fosse dichiarata, e si è "inventato" una dichiarazione che però non si è visto confermare al momento della definizione della funzione.

    In sostanza quindi quello che devi fare è:
    - spostare il corpo della funzione convertiMaiuscola prima di ogni suo utilizzo; questo costituisce contemporaneamente la dichiarazione (dico che esiste e che ha certi parametri) e la definizione (dico cosa fa) della funzione; da lì in poi il compilatore avrà presente la funzione e la potrai richiamare tranquillamente;
    - oppure, lasciare il corpo della funzione (la sua definizione) dove ti pare, ma mettere prima di qualunque suo utilizzo il suo prototipo (la sua dichiarazione), che consiste semplicemente nella linea in cui specifichi, nome, tipo restituito e argomenti della funzione seguito da un punto e virgola; in questa maniera da lì in poi il compilatore avrà presente che quella funzione esiste e prende quei parametri (per cui sa come interpretare il tuo codice), e si preoccuperà solo in seguito di "agganciare" quelle chiamate a funzione al codice effettivo della funzione.

    In genere si preferisce il secondo metodo: in cima al file (subito dopo i #include) o in un file di inclusione a parte si inseriscono tutti i prototipi delle funzioni definite nel file, in modo che siano "pronte all'uso" in ogni punto del file. Nel tuo caso quindi avrai:
    codice:
    #include <stdio.h>
    /* ... altri file di inclusione ... */
    
    /* prototipo di convertiMaiuscola */
    void convertiMaiuscola(char* string);
    /* ... eventuali altri prototipi ... */
    
    int main(void)
    {
        char prova[]="prova";
        convertiMaiuscola(prova);
        return 0;
    }
    
    /* definizione della funzione */
    void convertiMaiuscola(char string[]){
         int i, l;
         l = strlen(string);
         for(i=0; i<1; i++){
               if(string[i]>=97&&string[i]<=122) //la prima lettera e' minuscola?
              {
    	string[i] = string[i]-32; //si lo e', fa questo
              }
               else{
                     printf("\nLa lettera e' gia' maiuscola!\n");
               }
          }
          printf("%s", string);
    }
    Tra parentesi, per verificare se una lettera è minuscola puoi usare la funzione islower() di <ctype.h>, e per convertirla in maiuscolo puoi usare la toupper().
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    260
    Ti ringrazio, sei stato davvero molto esaustivo. Sai siccome è un progetto vorrei crearlo io l'algoritmo se possibile, quindi cercando di evitare funzioni presenti in librerie. Quindi mi conviene creare un sorgente con esclusivamente le funzioni da me create e poi in ogni altro sorgente dove ce n'è bisogno richiamo il file delle funzioni e ci piazzo il prototipo ad inizio file della funzione specifica che mi interessa
    Mi piace fare le cose ordinate e precise
    Grazie mille ancora
    Alla prossima

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.