Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] Problema codice con variabili char

    Salve a tutti!
    Ho provato ha fare un programma che, dato un array di tipo char, inizialmente si inserisca una stringa e tramite la funzione contatore (creata da me) conta singolarmente ogni vocale, numero, consonante , spazio, e altro (% _ ., / ...).
    Il programma riesco a compilarlo senza errori ma nell'esecuzione ritornano valori nulli...
    Non riesco a capire cosa posso aver sbagliato qualcuno ha qualche idea?

    codice:
    #include <stdio.h>
    #include <ctype.h>
    void contatore(char line[],int *v,int *c,int *n,int *s,int *a)
    {
        char z;
        int cont=0;
        while((z=toupper(line[cont]))!='\0')
        {
            if(z=='A' || z=='E' || z=='I' || z=='O' || z=='U') *v++;
            else if(z>='A' && z<='Z') *c++;
            else if(z>='0' && z<='9') *n++;
            else if(z==' ' || z=='\t') *s++;
            else *a++;
            cont++;
        }
    }
    main()
    {
        char line[80];
        int vocali=0;
        int consonanti=0;
        int numeri=0;
        int spazi=0;
        int altro=0;
        printf("Inserisci il testo\n");
        scanf("%[^\n]",line);
        contatore(line,&vocali,&consonanti,&numeri,&spazi,&altro);
        printf("\nLe vocali sono : %d",vocali);
        printf("\nLe consonanti sono : %d",consonanti);
        printf("\nI numeri sono : %d",numeri);
        printf("\nGli spazi sono : %d",spazi);
        printf("\nDel restante sono : %d\n",altro);
    }
    Ultima modifica di MItaly; 01-11-2013 a 05:47

  2. #2
    Utente di HTML.it L'avatar di ace.
    Registrato dal
    Oct 2013
    Messaggi
    6
    invece di incrementare i valori puntati dai puntatori con i due + (ad esempio *v++), prova a fare normalmente cioè *v+=1....può sembrare strano ma se non ricordo male una volta ho avuto un problema simile.

  3. #3
    Grazie XD,
    Ho fatto come mi hai consigliato e adesso tutto funziona correttamente.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da ace. Visualizza il messaggio
    invece di ...
    ... oppure utilizza le parentesi correttamente

    (*c)++;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Quote Originariamente inviata da ace. Visualizza il messaggio
    invece di incrementare i valori puntati dai puntatori con i due + (ad esempio *v++), prova a fare normalmente cioè *v+=1....può sembrare strano ma se non ricordo male una volta ho avuto un problema simile.
    Non è strano, semplicemente l'operatore ++ ha priorità superiore rispetto a *, per cui se scrivi *v++ è come scrivere *(v++) (incrementa il puntatore e poi dereferenzia), quando quello che vuoi è, come ha scritto correttamente oregon, (*v)++ - dereferenzia il puntatore e incrementa il valore a cui puntava.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di ace.
    Registrato dal
    Oct 2013
    Messaggi
    6
    ah, vi ringrazio per le delucidazioni

  7. #7
    Ok questo spiega tutto :-) grazie a tutti,
    Per curiosità personale, ho provato a fare lo stesso codice ma in c++ ed ho notato che gli array char non riconoscono gli spazi, ho cercato di informarmi su come poter fare ma non ho trovato soluzioni alternative , qualcuno ha qualche idea?

  8. #8
    Negli array di char ci possono tranquillamente essere spazi, semplicemente la scanf di default smette di acquisire una stringa al primo spazio se usi lo specificatore di formato %s; usa fgets (passando stdin come stream) per acquisire una linea intera.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Grazie per la seconda volta MItaly , adesso mi funziona anche in c++ :-)

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.