Input stringa di max 10 caratteri

Forum di discussioni su C e C++

Moderatori: Toki, skynet

Regole del forum
Leggi: IProgrammatori.it - Regolamento Forum
supervip97
New Entry
Messaggi: 5
Iscritto il: 18 mag 2017, 22:09

Input stringa di max 10 caratteri

Messaggioda supervip97 » 18 mag 2017, 22:22

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.


Codice: Seleziona tutto

#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;
}
Ultima modifica di supervip97 il 19 mag 2017, 15:13, modificato 2 volte in totale.
vuott
Utente Junior
Messaggi: 92
Iscritto il: 06 giu 2014, 15:14

Re: Input stringa di max 10 caratteri

Messaggioda vuott » 19 mag 2017, 01:19

Dovresti mostrare il codice da te scritto, perché possa essere controllato. :roll:
Avatar utente
LPs
Utente Junior
Messaggi: 74
Iscritto il: 09 mag 2017, 21:34

Re: Input stringa di max 10 caratteri

Messaggioda LPs » 19 mag 2017, 07:12

Senza vedere il codice che hai scritto è un po' difficile.
Ipotizzandolo immagino che tu abbia usato una classica scanf tipo

Codice: Seleziona tutto

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:

Codice: Seleziona tutto

#include <stdio.h>

int main(void)
{
   char stringa[11] = {0};

   scanf("%10s", stringa);

   printf("%s\n", stringa);

   return 0;
}
L'immaginazione è più importante della conoscenza. La conoscenza è limitata, l'immaginazione abbraccia il mondo - Albert Einstein

LPs-On StackOverflow
supervip97
New Entry
Messaggi: 5
Iscritto il: 18 mag 2017, 22:09

Re: Input stringa di max 10 caratteri

Messaggioda supervip97 » 19 mag 2017, 15:14

"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?
Avatar utente
LPs
Utente Junior
Messaggi: 74
Iscritto il: 09 mag 2017, 21:34

Re: Input stringa di max 10 caratteri

Messaggioda LPs » 19 mag 2017, 15:40

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')
Ultima modifica di LPs il 19 mag 2017, 16:20, modificato 1 volta in totale.
L'immaginazione è più importante della conoscenza. La conoscenza è limitata, l'immaginazione abbraccia il mondo - Albert Einstein

LPs-On StackOverflow
vuott
Utente Junior
Messaggi: 92
Iscritto il: 06 giu 2014, 15:14

Re: Input stringa di max 10 caratteri

Messaggioda vuott » 19 mag 2017, 16:13

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. :|
Ultima modifica di vuott il 19 mag 2017, 16:19, modificato 3 volte in totale.
+m2+
Utente Junior
Messaggi: 31
Iscritto il: 10 mag 2017, 18:22

Re: Input stringa di max 10 caratteri

Messaggioda +m2+ » 19 mag 2017, 16:15

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
Avatar utente
LPs
Utente Junior
Messaggi: 74
Iscritto il: 09 mag 2017, 21:34

Re: Input stringa di max 10 caratteri

Messaggioda LPs » 19 mag 2017, 16:18

+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 f15


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.
L'immaginazione è più importante della conoscenza. La conoscenza è limitata, l'immaginazione abbraccia il mondo - Albert Einstein

LPs-On StackOverflow
Avatar utente
LPs
Utente Junior
Messaggi: 74
Iscritto il: 09 mag 2017, 21:34

Re: Input stringa di max 10 caratteri

Messaggioda LPs » 19 mag 2017, 16:27

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'
L'immaginazione è più importante della conoscenza. La conoscenza è limitata, l'immaginazione abbraccia il mondo - Albert Einstein

LPs-On StackOverflow
vuott
Utente Junior
Messaggi: 92
Iscritto il: 06 giu 2014, 15:14

Re: Input stringa di max 10 caratteri

Messaggioda vuott » 19 mag 2017, 16:52

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 Immagine , siamo costretti comunque a premere il fatidico tasto Invio per raccogliere il carattere immesso in stdin.....
supervip97
New Entry
Messaggi: 5
Iscritto il: 18 mag 2017, 22:09

Re: Input stringa di max 10 caratteri

Messaggioda supervip97 » 19 mag 2017, 16:58

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
Avatar utente
LPs
Utente Junior
Messaggi: 74
Iscritto il: 09 mag 2017, 21:34

Re: Input stringa di max 10 caratteri

Messaggioda LPs » 19 mag 2017, 17:05

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 Immagine , 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.
L'immaginazione è più importante della conoscenza. La conoscenza è limitata, l'immaginazione abbraccia il mondo - Albert Einstein

LPs-On StackOverflow
vuott
Utente Junior
Messaggi: 92
Iscritto il: 06 giu 2014, 15:14

Re: Input stringa di max 10 caratteri

Messaggioda vuott » 19 mag 2017, 17:42

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: :|

Codice: Seleziona tutto

#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.
+m2+
Utente Junior
Messaggi: 31
Iscritto il: 10 mag 2017, 18:22

Re: Input stringa di max 10 caratteri

Messaggioda +m2+ » 19 mag 2017, 18:29

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?
vuott
Utente Junior
Messaggi: 92
Iscritto il: 06 giu 2014, 15:14

Re: Input stringa di max 10 caratteri

Messaggioda vuott » 19 mag 2017, 20:16

Ritieni sia un po' migliore questo ? :|

Codice: Seleziona tutto

#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;

}

Torna a “C/C++”

Chi c’è in linea

Visitano il forum: Yahoo [Bot] e 84 ospiti