Funzioni e stringa

di il
13 risposte

Funzioni e stringa

Salve a tutti.. studiando dal mio libro 'guida alla programmazione, linguaggio C, ho provato a fare gli eser di ogni capitolo ma non riesco a fare questo. Sarà sicuramente facile, per chi ne capisce più di me. momentaneamente mi sento una deficente. Potreste aiutarmi scrivendo i commenti in ogni istruzione? grazie mille in anticipo.
questo è il testo: "Scrivere una funzione che, data una stringa di caratteri, converta tutte le lettere da maiuscole in minuscole. Si passi la stringa tramite variabile globale".
Io lo avevo provato a fare così, ma non so andare avanti.

#include <stdio.h>
char s[n];
void ConversioneLettere(char, char);
main()
{
int i, n;
printf("Di quanti elementi vuoi che sia la tua stringa?: ");
scanf("%d", &n);
for(i=0; i<n; i++){
printf("Inserisci %d carattere della tua stringa: ", i+1);
scanf("%d", &a); }

ConversioneLettere();
}

double ConversioneLettere(char 'A', char 'a');
{
int i,
for(i=0; i<n; i++) {
if(a=='A'
'A' = a


}
}

Lo vorrei capire col la libreria <stdio.h>. ancora le altre librerie non le ho studiate

13 Risposte

  • Re: Funzioni e stringa

    Il codice e' un disastro . Sembra buttato li a casaccio!

    Non voglio essere cattivo, ma se devo descrivere gli errori presenti in ogni riga, posso scrivere un'enciclopedia !

    Ci sono errori di tutti i tipi: sintattici, semantici, di logica ...

    Dai , comunque non e' gravissimo. Basta ricominciare !

    Per prima cosa, usa un file con estensione ".cpp" e non ".c".

    Quindi, come seconda cosa, scrivi un programmino che almeno compili!

    Poi se ne discute.

    Ma per evitare di diventare matto, ricomincia da zero e scrivi un pezzetto di codice alla volta:

    1) lo scrivi
    2) lo compili
    3) se non compila cerchi di capire perche' e lo correggi, se non va ancora ricominci. Se proprio continua a non funzionare, lo posti e se ne discute. Ma prima ragionaci su!
    4) lo esegui, se non funziona, se ne discute.

    Ti do lo spunto iniziale.

    Il codice minimo da cui devi partire e' il seguente:
    #include <stdio.h>

    int main(int argc, char** argv)
    {
    printf("Parto da qui\n");

    return 0;
    }
    Nota come e' stato scritto il main! Non quella cosa strana che hai scritto tu.

    Questo compila e puo' essere eseguito!
  • Re: Funzioni e stringa

    Ti ringrazio tantissimo. so che è un disastro. e accetto anche tutti i tuoi consigli. quella è la cosa che non ho mai fatto xD (quella di fare un pezzetto di programmino alla volta)
    accetto tutto però nel mio libro porta che posso scrivere la finzione mani cos':
    main()
    {

    ...
    ...
    ...
    }

    quindi non credo che il primo errore sia quello. ce ne saranno una miriade sicuramente
  • Re: Funzioni e stringa

    La sintassi che descrivi e' una vecchia (e orrenda) sintassi C.
    Il C++ legge perfettamente il codice C, ma e' molto piu' ligio alle regole.
    La conseguenza e' che si accorge meglio degli errori e non permette di scrivere castronate come 'main()'.

    Per questo ti ho detto di usare file con estensione .cpp e non .c

    Tu mi dirai: ma sto studiando il C, non il C++!

    La risposta e' : tu continua a studiare il C, ma sfrutta il compilatore che ti trova il maggior numero di errori possibile.
    Piu' errori trova lui, meno ne farai tu!
  • Re: Funzioni e stringa

    Credo che questo ti possa aiutare se consideri una stringa
    il programma è spiegato passo passo
    
    #include <stdio.h>
    #define n 100
    
    /*PROGRAMMA CHE CONVERTE DA MINUSCOLE IN MAIUSCOLE TESTI SENZA SPAZIO*/
    
    /*dichiarazione funzioni*/
    char caratterimaiuscoli(char *);
    
    /*dichiarazione variabili*/
    char stringa[n];
    char *s;
    
    char caratterimaiuscoli(char *s)
    {
    while(*s != '\n')
    	{
    		if(*s>='a' && *s<='z' )		/*if(*s>='97' && *s<='122')*/
    			{
    				*s -= 32; /*se inserisco += al posto di -= la funzione converte da maiuscole a minuscole*/
    			}
    		++s;	
    	}
    }
    
    int main()
    {
    printf("Inserire testo:\n");
    scanf("%s",stringa);
    if(stringa[n]='\n')
    	{
    		printf("\n");	
    		caratterimaiuscoli(stringa);
    		printf("Testo in MAIUSCOLO:\n%s\n",stringa);
    	}
    }
  • Re: Funzioni e stringa

    stefanaimon ha scritto:


    credo che questo ti possa aiutare se consideri una stringa
    il programma è spiegato passo passo
    
    #include <stdio.h>
    #define n 100
    
    /*PROGRAMMA CHE CONVERTE DA MINUSCOLE IN MAIUSCOLE TESTI SENZA SPAZIO*/
    
    /*dichiarazione funzioni*/
    char caratterimaiuscoli(char *);
    
    /*dichiarazione variabili*/
    char stringa[n];
    char *s;
    
    char caratterimaiuscoli(char *s)
    {
    while(*s != '\n')
    	{
    		if(*s>='a' && *s<='z' )		/*if(*s>='97' && *s<='122')*/
    			{
    				*s -= 32; [b]/*se inserisco += al posto di -= la funzione converte da maiuscole a minuscole*/[/b]
    			}
    		++s;	
    	}
    }
    
    int main()
    {
    printf("Inserire testo:\n");
    scanf("%s",stringa);
    if(stringa[n]='\n')
    	{
    		printf("\n");	
    		caratterimaiuscoli(stringa);
    		printf("Testo in MAIUSCOLO:\n%s\n",stringa);
    	}
    }
    L'hai provato prima di postarlo?
  • Re: Funzioni e stringa

    Ovvio
  • Re: Funzioni e stringa

    A me gcc restituisce questo, quindi direi che ci sono parecchie cose che non funzionano:
    
    ~$ gcc -Wall main.c
    main.c: In function ‘caratterimaiuscoli’:
    main.c:19:23: error: expected expression before ‘[’ token
                 *s -= 32; [b]/*se inserisco += al posto di -= la funzione converte da maiuscole a minuscole*/[/b]
                           ^
    main.c:19:24: error: ‘b’ undeclared (first use in this function)
                 *s -= 32; [b]/*se inserisco += al posto di -= la funzione converte da maiuscole a minuscole*/[/b]
                            ^
    main.c:19:24: note: each undeclared identifier is reported only once for each function it appears in
    main.c:20:10: error: expected ‘;’ before ‘}’ token
              }
              ^
    main.c: In function ‘main’:
    main.c:29:1: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     if(stringa[n]='\n')
     ^
    main.c: In function ‘caratterimaiuscoli’:
    main.c:23:1: warning: control reaches end of non-void function [-Wreturn-type]
     }
     ^
    main.c: In function ‘main’:
    main.c:35:1: warning: control reaches end of non-void function [-Wreturn-type]
     }
     ^
    
  • Re: Funzioni e stringa

    A me il compilatore da questo:
    
    ...~/Desktop$ make ese
    cc     ese.c   -o ese
    ...~/Desktop$ ./ese
    Inserire testo:
    ciao
    
    Testo in MAIUSCOLO:
    CIAO
    quindi me lo esegue e funziona..
    riposto il codice forse durante la copia qualche carattere è andato perso boh

    #include <stdio.h>
    #define n 100
    
    /*PROGRAMMA CHE CONVERTE DA MINUSCOLE IN MAIUSCOLE TESTI SENZA SPAZIO*/
    
    /*dichiarazione funzioni*/
    char caratterimaiuscoli(char *);
    
    /*dichiarazione variabili*/
    char stringa[n];
    char *s;
    
    char caratterimaiuscoli(char *s)
    {
    while(*s != '\n')
    	{
    		if(*s>='a' && *s<='z' )		/*if(*s>='97' && *s<='122')*/
    			{
    				*s -= 32; /*se inserisco += al posto di -= la funzione converte da maiuscole a minuscole*/
    			}
    		++s;	
    	}
    }
    
    int main()
    {
    printf("Inserire testo:\n");
    scanf("%s",stringa);
    if(stringa[n]='\n')
    	{
    		printf("\n");	
    		caratterimaiuscoli(stringa);
    		printf("Testo in MAIUSCOLO:\n%s\n",stringa);
    	}
    }
    
  • Re: Funzioni e stringa

    Ah è successo praticamente che ha preso i caratteri in grassetto, copia quest'altro codice che è uguale e senza grassetto e vedi che va
  • Re: Funzioni e stringa

    Ma a cosa serve questo ?
    if(stringa[n]='\n')
    poi nella funzione ti fermi quando trovi '\n' ma la funzione scanf a fine lettura della stringa mette '\0' e quello che rimane è potenzialmente indefinito, se ti esce correttamente e solo perchè qualcuno ha inizializzato il vettore al posto tuo ...
    P.S.:non avevo considerato il controllo *s>='a' && *s<='z'
    
    #include <stdio.h>
    #define n 100
    
    /*PROGRAMMA CHE CONVERTE DA MINUSCOLE IN MAIUSCOLE TESTI SENZA SPAZIO*/
    
    /*dichiarazione funzioni*/
    char caratterimaiuscoli(char *);
    
    /*dichiarazione variabili*/
    char stringa[n];
    char *s;
    
    char caratterimaiuscoli(char *s)
    {
        char ignoto='\0';
    while(*s != '\n')
       {
          if(*s>='a' && *s<='z' )      /*if(*s>='97' && *s<='122')*/
             {
                *s -= 32; /*se inserisco += al posto di -= la funzione converte da maiuscole a minuscole*/
             }
          ++s;
       }
       return ignoto;
    }
    
    int main()
    {
    printf("Inserire testo:\n");
    scanf("%s",stringa);
    if(stringa[n]='\n')//scopo?
       {
          printf("\n");
          caratterimaiuscoli(stringa);
          int stampati=printf("Testo in MAIUSCOLO:\n%s\n",stringa);
       }
    }
    
    
  • Re: Funzioni e stringa

    Era un controllo di prova che non ho eliminato, se lo elimini rimane cmq uguale l esecuzione del programma
  • Re: Funzioni e stringa

    Come ti è stato detto, quel controllo non ha senso e, anzi, potenzialmente potrebbe provocare un crash. Inoltre non capisco perché la funzione dovrebbe restituire un char (e poi non lo fa); è meglio che sia void.

    Quindi la funzione corretta è
    
    void caratterimaiuscoli(char *s)
    {
    	while(*s)
    	{
          if(*s>='a' && *s<='z' ) *s -= 32; 
    	  s++;
    	}
    }
    
    e la chiami senza quella if
    
    int main()
    {
    	printf("Inserire testo:\n");
    	scanf("%s",stringa);
    	printf("\n");   
    	caratterimaiuscoli(stringa);
    	printf("Testo in MAIUSCOLO:\n%s\n",stringa);
    }
    
  • Re: Funzioni e stringa

    E poi il while si può fermare a '\0'
    
    void caratterimaiuscoli(char *s)
    {
    while(*s != '\0')
       {
          if(*s>='a' && *s<='z' )      /*if(*s>='97' && *s<='122')*/
             {
                *s -= 32; /*se inserisco += al posto di -= la funzione converte da maiuscole a minuscole*/
             }
          ++s;
       }
    }
    
    comunque ieri poi l'abbiamo risolto in questo modo:
    
    #include <stdio.h>
    #define N 100
    #define VERO 1
    #define FALSO 0
    
    char vettore[N];
    int dim;
    int letto=FALSO;
    
    void maiuscolizza();
    
    int main()
    {
        char carattere;
        int finito = FALSO;
        int i=0;
    
        printf("Inserire un testo senza spazi di massimo %d caratteri terminando con INVIO\n",N);
        while (!finito&&i<N)
        {
            scanf("%c",&carattere);
            if (carattere=='\n')
                finito=VERO;
            else
            {
                if(!i)
                    letto = VERO;
                vettore[i]=carattere;
                i++;
            }
        }
        dim=i;
        maiuscolizza();
        for(i=0;i<dim;i++)
            printf("%c",vettore[i]);
        return 0;
    }
    
    void maiuscolizza()
    {
        if(letto)
        {
            int i;
            for(i=0; i<dim; i++)
                vettore[i]+= 'A'-'a';
        }
        return;
    }
    
    Lei non ha ancora fatto i puntatori e ci siamo arrangiati
Devi accedere o registrarti per scrivere nel forum
13 risposte