Input stringa di max 10 caratteri

di il
19 risposte

Input stringa di max 10 caratteri

Salve,
devo creare una piccola funzione che faccia inserire il nome di un utente di massimo 10 caratteri.
è possibile, in run time, fare in modo che non sia più concesso inserire alcun carattere dopo aver inserito il decimo carattere ?
Io l' ho implementato facendo un controllo sulla stringa inserita e se essa è >10 richiederà l'input.
ma cosi facendo ho il problema che inserendo una stringa di 20 avendo dichiarato il vettore di 10 va in crash.

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

int main(void) {
	char name1[10],name2[10];
	int c=10;
	while(c>=10)
	{

	printf("inserisci nome primo giocatore\n");

	gets(name1);
	c=strlen(name1);
	if (c>10){
	printf("ERRORE INSERIMENTO\n");
	printf("inserire nome di massimo 10 caratteri\n");
	printf("riprova\n");}
	}

	printf("NOME INSERITO CORRETTMENTE\n\n");
c=10;
while(c>=10)
	{

	printf("inserisci nome secondo giocatore\n");

	gets(name2);
	c=strlen(name2);
	if (c>10){
	printf("ERRORE INSERIMENTO\n");
	printf("inserire nome di massimo 10 caratteri\n");
	printf("riprova\n");}
	}

    printf("NOME INSERITO CORRETTMENTE\n\n\n");
    printf(" PLAYER1:   %s\n",name1);
	printf(" PLAYER2:   %s\n",name2);

	system("PAUSE");



	return EXIT_SUCCESS;
}

19 Risposte

  • Re: Input stringa di max 10 caratteri

    Dovresti mostrare il codice da te scritto, perché possa essere controllato.
  • Re: Input stringa di max 10 caratteri

    Senza vedere il codice che hai scritto è un po' difficile.
    Ipotizzandolo immagino che tu abbia usato una classica scanf tipo
    
    char stringa[11] = {0};
    scanf("%s", stringa);
    
    In questo caso l'approccio è sbagliato. In poche parole quello che ti viene richiesto è di sviluppare un ciclo che riceve un carattere alla volta e, completata la ricezione con un '\n' (invio) oppure, al raggiungimento dei 10 caratteri, blocchi la memorizzazione dei caratteri inseriti dall'utente nella stringa.

    La funzione getc può esserti d'aiuto.

    Oppure se nel tuo caso vuoi/puoi (nel senso che chi ti ha dato il compito lo accetta) usando la scanf puoi specificare la lunghezza nel formato e fa tutto da sola:
    
    #include <stdio.h>
    
    int main(void)
    {
    	char stringa[11] = {0};
    
    	scanf("%10s", stringa);
    
    	printf("%s\n", stringa);
    
    	return 0;
    }
    
  • Re: Input stringa di max 10 caratteri

    "un ciclo che riceve un carattere alla volta e, completata la ricezione con un '\n' (invio) oppure, al raggiungimento dei 10 caratteri, blocchi la memorizzazione dei caratteri inseriti dall'utente nella stringa."
    mi potresti scrivere il codice?
  • Re: Input stringa di max 10 caratteri

    Richiede la pappa pronta è ot, e in ogni caso non sarebbe di nessuna utilità per te.

    Posso darti qualke dritta, poi vedi di elaborare un codice da solo:

    prima di tutto: NON USARE MAI LA FUNZIONE gets. e stata deprecata nel c99 ed eliminata completamente dal C11. Non so se sia mai esistita una funzione più pericolosa.

    Usa invece la funzione fgetc che ti permette di leggere un carattere per volta.

    Poi basta un semplice ciclo che controlla il numero di caratteri inseriti per non adare oltre i 10 richiesti.

    Ricordati sempre che in C le stringhe sono nul-terminated, che significa che hanno sempre un "carattere nascosto" alla fine di valore 0. Quindi un nome di 10 caratteri sarà inserita in una stringa di 10+1 caratteri.

    Ultima nota: devi provvedere tu a terminare la stringa correttamente con il carattere terminatore o (0x00, '\0')
  • Re: Input stringa di max 10 caratteri

    supervip97 ha scritto:


    "un ciclo che riceve un carattere alla volta e, completata la ricezione con un '\n' (invio)
    ehmmm....il compito mi pare un po' particolare, poiché mi sembra che sia richiesto che la pressione del tasto "Invio", debba provocare l'arresto del ciclo.
    Il che mi sembra lascia intendere che l'utente possa inserire anche nomi formati da un numero di caratteri minore di 10.

    Se però, come letteralmente richiesto, ad ogni ciclo si deve inviare un carattere, ho l'impressione che in tal caso non si possano utilizzare le funzioni "scanf( )" e "getc( )", le quali - se non erro - richiedono comunque la pressione del tasto "Invio" per la lettura del carattere immesso nello standard input. Tasto che però provocherebbe l'uscita evidentemente anticipata dal ciclo di immissione dei caratteri.

    Suppongo che - posto così il compito, e con riferimento alla fase di immissione dei caratteri nel ciclo - si debbano sfuttare - se non vado errato - le risorse dichiarate nel file header "termios.h", che consentono - fra l'altro - di individuare i tasti premuti della tastiera.
  • Re: Input stringa di max 10 caratteri

    LPs ha scritto:


    Poi basta un semplice ciclo che controlla il numero di caratteri inseriti per non adare oltre i 10 richiesti.
    a dir la verità non è superbanale, perchè (almeno) il tasto backspace ci vorrebbe, altrimenti somiglia alle funzioni di inserimento password *nix.
    comunque come esercizio didattico il ciclo dovrà verificare sia la lunghezza massima, sia la pressione ad esempio di INVIO per terminare l'inserimento e confermare quanto immesso
  • Re: Input stringa di max 10 caratteri

    +m2+ ha scritto:


    LPs ha scritto:


    Poi basta un semplice ciclo che controlla il numero di caratteri inseriti per non adare oltre i 10 richiesti.
    a dir la verità non è superbanale, perchè (almeno) il tasto backspace ci vorrebbe, altrimenti somiglia alle funzioni di inserimento password *nix.
    comunque come esercizio didattico il ciclo dovrà verificare sia la lunghezza massima, sia la pressione ad esempio di INVIO per terminare l'inserimento e confermare quanto immesso
    Visto il ivello, direi che chi ha asseganto il compito non si aspetta di sicuro la gestione del backspace, ..... ma magari mi sbaglio.


    Di sicuro, se la prevedesse, ownerebbe di brutto


    In ogni caso se usa un environment standard, la classica fgetc prende in pasto l'input dopo la pressione dell'invio, quindi i backspace sono gestiti direttamente dal terminale.
  • Re: Input stringa di max 10 caratteri

    vuott ha scritto:


    Se però, come letteralmente richiesto, ad ogni ciclo si deve inviare un carattere, ho l'impressione che in tal caso non si possano utilizzare le funzioni "scanf( )" e "getc( )", le quali - se non erro - richiedono comunque la pressione del tasto "Invio" per la lettura del carattere immesso nello standard input. Tasto che però provocherebbe l'uscita evidentemente anticipata dal ciclo di immissione dei caratteri.
    Non è proprio così, effettivamente fgetc prende in esame i dati da stdin dopo che è stato premuto il tasto invio (anche se ci sarebbe da controllare in che environment viene eseguito, nel senso che si potrebbe settare stdin come non bufefred e il gioco è fatto), ma poi riceve i caratteri 1 a 1 quindi il ciclo si conclude dopo aver scorso tutti i caratteri fino al '\n'
  • Re: Input stringa di max 10 caratteri

    Scusami, ma non riesco a capire.
    Senza pensare ora ad un settaggio dello standard input come non "buffered", dovendo inserire un carattere alla volta, qualsiasi funzione utilizziamo fra "scanf( )", "getc( )" o "fgets( )" (con impostazione 2 al secondo parametro per ricevere 1 carattere), se non erro , siamo costretti comunque a premere il fatidico tasto Invio per raccogliere il carattere immesso in stdin.....
  • Re: Input stringa di max 10 caratteri

    LPs ha scritto:


    vuott ha scritto:


    Se però, come letteralmente richiesto, ad ogni ciclo si deve inviare un carattere, ho l'impressione che in tal caso non si possano utilizzare le funzioni "scanf( )" e "getc( )", le quali - se non erro - richiedono comunque la pressione del tasto "Invio" per la lettura del carattere immesso nello standard input. Tasto che però provocherebbe l'uscita evidentemente anticipata dal ciclo di immissione dei caratteri.
    Non è proprio così, effettivamente fgetc prende in esame i dati da stdin dopo che è stato premuto il tasto invio (anche se ci sarebbe da controllare in che environment viene eseguito, nel senso che si potrebbe settare stdin come non bufefred e il gioco è fatto), ma poi riceve i caratteri 1 a 1 quindi il ciclo si conclude dopo aver scorso tutti i caratteri fino al '\n'
    è per un progetto d'anno all' univeristà.
    la funzione deve accettare stringhe di max 10 caratteri ma anche di lunghezza minore
  • Re: Input stringa di max 10 caratteri

    vuott ha scritto:


    Scusami, ma non riesco a capire.
    Senza pensare ora ad un settaggio dello standard input come non "buffered", dovendo inserire un carattere alla volta, qualsiasi funzione utilizziamo fra "scanf( )", "getc( )" o "fgets( )" (con impostazione 2 al secondo parametro per ricevere 1 carattere), se non erro , siamo costretti comunque a premere il fatidico tasto Invio per raccogliere il carattere immesso in stdin.....
    Ripeto: dipende da come è impostato l'environment, ma normalmente s: stdin è line buffered, quindi le funzioni lo prendono dopo un newline.
  • Re: Input stringa di max 10 caratteri

    LPs ha scritto:


    Ripeto: dipende da come è impostato l'environment, ma normalmente s: stdin è line buffered, quindi le funzioni lo prendono dopo un newline.
    ...quindi, da quel che capisco, dopo quelle predette funzioni basterà opportunamente svuotare il buffer di input (stdin).

    Una sorta di questo genere:
    #include <stdio.h>
    
    
    int main(void) {
    
       char name1[16], n=0, cestino;
    
       printf("inserisci nome primo giocatore\n");
    
       while(10>n) {
    	*(name1+n)=getc(stdin);
    	if (10==*(name1+n))
    		break;
    	cestino = getc(stdin);
    	++n;
       }   
    
       printf("NOME INSERITO CORRETTMENTE\n\n");
       printf("Verifica: %s\n", name1);
    
    	return 0;
    
    }
    Ti ringrazio.
  • Re: Input stringa di max 10 caratteri

    Direi di no.
    a parte che 10>n non l'ho mai visto, e sono più di 30 anni che programmo, lo stile è pessimo ma, soprattutto, lo zero?
  • Re: Input stringa di max 10 caratteri

    Ritieni sia un po' migliore questo ?
    #include <stdio.h>
    
    
    int main(void) {
    
       char name[16]={'\0'}, n=0;
    
       printf("inserisci nome primo giocatore\n");
    
       while((n<10) && ((name[n++]=getchar())!=10) ) {
           getchar();
       }
    
       printf("Verifica: %s\n", name);
    
    	return 0;
    
    }
Devi accedere o registrarti per scrivere nel forum
19 risposte