Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [C] Problema distinzione tra Nul e Blank

    Salve a tutti, sto cercando di eseguire un esercizio che mi chiede di creare un programma in grado di contare vocali e consonanti di una stringa immessa dall'utente.
    Non riesco a capire perchè il carattere di spazio venga riconosciuto come \0
    c'è un errore nel mio codice o non ho capito qualcosa sulle stringhe?
    Grazie a tutti, di seguito il codice:

    codice:
    #include <stdio.h> 
    #include <stdlib.h> 
    #define M 15 
    
    int main(int argc, char *argv[]) {     
    
    int k=0,k2=0;      
    char S[M], C;                       
    
    printf("\nInserire una stringa di massimo 15 caratteri:\n");                  
    scanf("%s", S);                 
    fflush(stdin);                  
    
    while(S[k]!='\0') {                                    
    if((S[k]=='A') || (S[k]=='E') || (S[k]=='I') || (S[k]=='O') || (S[k]=='U') || (S[k]=='a') || (S[k]=='e') || (S[k]=='i') || (S[k]=='o') || (S[k]=='u'))
                                                       k2++;   
    k++;
                                        }
                                                            
    printf("\nNella stringa sono presenti %d Vocali e %d consonanti.\n",k2,k-k2);
    
    system("PAUSE");
    return 0; }

  2. #2
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460
    vista la domanda non conviene neanche dare una occhiata al codice: il carattere di spaziatura è considerato carattere terminatore in fase di acquisizione della stringa quindi se tu fai leggere a scanf una stringa del tipo

    codice:
    Hello World
    lui si ferma al primo spazio e ti legge solo

    codice:
    Hello
    di conseguenza, essendo una stringa, il carattere che tu pensi sia lo spazio, in realtà è il tappo della variabile stringa, ovvero proprio

    codice:
    \0

  3. #3
    Un momento, se dopo l'acquisizione della stringa io mando la stampa a video a me la stringa me la fa vedere per intero, però nel conteggio delle vocali/consonanti si ferma appunto al carattere di blank.

    come posso raggirare questa cosa per risolvere questo esercizio
    Qualcosa non mi è chiaro

    Grazie per la delucidazione comunque

  4. #4
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460
    Originariamente inviato da darkoopa
    Un momento, se dopo l'acquisizione della stringa io mando la stampa a video a me la stringa me la fa vedere per intero, però nel conteggio delle vocali/consonanti si ferma appunto al carattere di blank.

    come posso raggirare questa cosa per risolvere questo esercizio
    Qualcosa non mi è chiaro

    Grazie per la delucidazione comunque
    la funzione scanf accetta 2 argomenti, il primo è un operatore che indica il tipo che viene letto in input e il secondo è la variabile di destinazione del contenuto letto, puoi agire sul primo argomento specificando una lista di caratteri che accetti in input, lo spazio non è accettato perché usi

    codice:
    %s
    come operatore, puoi quindi ovviare a ciò specificando qualcosa del genere

    codice:
    #include <stdio.h>
    
    int main(){
        char miaParola[100];
        printf("Inserisci la magnifica stringa: ");
        scanf("%[ a-zA-Z0-9+*/-]",miaParola);
        printf("\n\nLa magnifica stringa immessa e' %s\n\n",miaParola);
    }
    vedrai che ti include anche gli spazi insieme ai caratteri specificati dopo il simbolo di percentuale tra le parentesi quadre.

  5. #5
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460
    ricorda che scanf pone problemi di sicurezza, in pratica legge qualsiasi cosa gli venga data in input senza nessun "filtro", in generale è meglio usare funzioni come puts() e gets()

    codice:
    #include <stdio.h>
    
    int main(){
        char miaParola[100];
        puts("Inserisci la magnifica stringa: ");
        gets(miaParola);
        puts(miaParola);
    }

  6. #6
    non la gets. La gets è l'origine dei problemi di sicurezza per eccellenza. Infatti molti compilatori, tra cui gcc, segnalano in un warning che sarebbe meglio evitarne l'utilizzo
    se proprio vuole usare qualcosa del genere DEVE usare la fgets()
    all that you need:
    http://www.cplusplus.com/reference/clibrary/

  7. #7
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da Freax
    puoi quindi ovviare a ciò specificando qualcosa del genere

    codice:
    #include <stdio.h>
    
    int main(){
        char miaParola[100];
        printf("Inserisci la magnifica stringa: ");
        scanf("%[ a-zA-Z0-9+*/-]",miaParola);
        printf("\n\nLa magnifica stringa immessa e' %s\n\n",miaParola);
    }
    vedrai che ti include anche gli spazi insieme ai caratteri specificati dopo il simbolo di percentuale tra le parentesi quadre.
    Di soluzioni per evitare il problema dello spazio nelle stringhe ne ho viste tante, questa è la migliore in assoluto, almeno per me

  8. #8
    Originariamente inviato da goatboy
    Di soluzioni per evitare il problema dello spazio nelle stringhe ne ho viste tante, questa è la migliore in assoluto, almeno per me
    Resta comunque vulnerabile ad attacchi di stack overflow. Si può sistemare aggiungendo il numero massimo di caratteri da acquisire prima di "s", ma non vedo perché non usare molto più semplicemente la fgets (NON la gets).
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da MItaly
    Resta comunque vulnerabile ad attacchi di stack overflow. Si può sistemare aggiungendo il numero massimo di caratteri da acquisire prima di "s", ma non vedo perché non usare molto più semplicemente la fgets (NON la gets).
    Io però non capisco perchè la scanf è "pericolosa".. perchè è meglio usare la fgets?

  10. #10
    perché con la fgets devi specificare quanti caratteri al più catturare dall'input, mentre con la scanf no. Questo significa che la scanf tenterà di inserire tutto l'input all'interno della variabile stringa anche se non vi è sufficiente spazio a disposizione -> andrà a scrivere in zone di memoria nelle quali non ha "i permessi" per farlo

    si chiamano "problemi di buffer overflow"
    nel migliore dei casi potrebbero portare al crash dell'applicazione, nel peggiore potrebbero portare all'esecuzione di codice malevolo inserito da un altro programmatore.
    all that you need:
    http://www.cplusplus.com/reference/clibrary/

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 © 2024 vBulletin Solutions, Inc. All rights reserved.