Problemino puntatori

di il
3 risposte

Problemino puntatori

Ciao ho il seguente problema: devo fare un programma che riceva una stringa da tastiera e la visualizzi, dopo chiamando una funzione devo convertire la prima lettera in maiuscolo mentre tutte le altre in minuscolo. La funzione (che io ho chiamato capital) riceve la stringa by reference usando quindi un puntatore.
questo è il programma che ho scritto:

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

char *capital(char *s); (la funzione capital riceve come parametro un puntatore e restituisce un puntatore)
int main()
{char *s,*s2; (dichiaro i puntatori a 2 stringhe)
char s1[5];
s=s1; (associo il puntatore a una stringa)
printf("s:");
scanf("%s",s); (acquisisco la stringa)

while(*s!='\0'){
printf("%c",*s); (stampo la stringa)
s++;
}

s2=capital(s); (associo il puntatore s2 al puntatore ritornato dalla funzione)

while(*s2!='\0'){
printf("%c",*s2); (stampo la stringa puntata da s2)
s++;
}
return 0;
}


char *capital(char *s){
char *s1; (dichiaro un puntatore s1)
s1=s; (associo s1 al puntatore ricevuto dalla funzione )
if(isalpha(*s1)){ (verifico che il primo elemento della stringa, che è quello puntato da s1 sia una lettera)
*s1=toupper(*s1); (converto la prima lettera in maiuscolo)
s1++; (sposto il puntatore all'elemento successivo)
}
(adesso s1 punta al secondo elemento)
while(*s1!='\0'){ (finchè il puntatore non trova la fine della stringa converte l'elemento puntato in miniscolo)
*s1=tolower(*s1);
s1++;
}

return s1; (ritorna il puntatore s1)
}




Eseguendo il codice, code blocks mi fa digitare la stringa , la stampa e termina,senza dare nessun errore!

Sicuramente sono io che non ho capito qualcosa sui puntatori...ma sto impazzendo!
Mi aiutate per favoreeee?

3 Risposte

  • Re: Problemino puntatori

    Occhio a quando incrementi i vari puntatori ... se fai

    s++

    dopo non potrai usare s perché non avrà il valore iniziale ...

    Quindi le modifiche sono

    s2=capital(s1); // s1 e non s perché s è stato modificato

    nel ciclo che segue

    s2++; // e non s++;

    e nella funzione

    return s; // s e non s1 perché s1 è stato modificato
  • Re: Problemino puntatori

    La prima regola fondamentale è quella di racchiudere il codice dentro agli appositi tag [ c o d o ] [ / c o d e]
    E naturalmente i commenti negli specifici // oppure /* */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    
    char *capital(char *s);
    int main()
    {
        char s1[80];//5 è un pò pochino meglio 80 che è la classica lunghezza della console.
    
        printf("s:");
        scanf("%s",s1);//posso usare direttamente s1.
    
        /*
        while(*s!='\0'){
            printf("%c",*s); (stampo la stringa)
            s++;
        }
        tantovale scriver:*/
        printf("%s\n",s1);
    
        capital(s1);//dato che uso il puntatore modifico direttamente la variabile.
    
        printf("%s\n",s1);
    
        return 0;
    }
    
    char *capital(char *s)
    {
        //dato che s è un nuovo puntatore alla stringa posso usare direttamente tale puntatore per le modifiche
        char* mems = s; //memorizzo però il punto di partenza per poterlo restituire correttamente.
        if(isalpha(*s))
            *s=toupper(*s);
    
        while(*s++ != '\0')
            *s = tolower(*s);
        return mems;
    }
    
    
  • Re: Problemino puntatori

    Grazie mille vbextrem e oregon siete stati chiarissimi! Mi avete tirato fuori da un dubbio esistenziale!
Devi accedere o registrarti per scrivere nel forum
3 risposte