Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ricevere spazi in array char scanf o cin
Forum - C/C++ - Ricevere spazi in array char scanf o cin

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
E' possibile far si che quando vengono inseriti degli spazi tramite scanf o cin evitare che nell'array di char venga ricevuta la stringa precedente allo spazio
Es(console):

char arraychar[N]
Input:ciao bob(cin>>arraychar)
Output:ciao(cout<<arraychar)

spero di essere stato chiaro...
grazie

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 15:04
Sabato, 14/08/2010


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
jack92 (Member)
Pro


Messaggi: 100
Iscritto: 06/08/2010

Segnala al moderatore
Postato alle 18:49
Sabato, 14/08/2010
Oppure puoi usare la funzione "gets(arraychar)" se vuoi usare il C (invece di "scanf()")http://it.wikipedia.org/wiki/Gets_%28funzione%29 ;)


"Il sapere umano appartiene al mondo"
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:33
Sabato, 14/08/2010
Testo quotato

Postato originariamente da jack92:

Oppure puoi usare la funzione "gets(arraychar)" se vuoi usare il C (invece di "scanf()")http://it.wikipedia.org/wiki/Gets_%28funzione%29 ;)



Ho letto la procedura, e a mio avviso è confusa e inattendibile.
Legge dati da tastiera o file?
Non fa alcun controllo dimensionale sul puntatore passato.
In c++, esistono metodi migliori per risolvere il problrma.


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
jack92 (Member)
Pro


Messaggi: 100
Iscritto: 06/08/2010

Segnala al moderatore
Postato alle 11:00
Domenica, 15/08/2010
Testo quotato

Postato originariamente da Poggi Marco:

Ho letto la procedura, e a mio avviso è confusa e inattendibile.
Legge dati da tastiera o file?
Non fa alcun controllo dimensionale sul puntatore passato.
In c++, esistono metodi migliori per risolvere il problrma.



Legge dati da tastiera o file?

Se non ho capito male legge il buffer della tastiera (quello che hai appena scritto),contenuto nel file stdin e lo copia nella stringa che gli passi come parametro

In c++, esistono metodi migliori per risolvere il problrma

Indubbiamente :rofl::k: ma avevo letto che gli servia una funzione relativa alla "scanf" o alla "cin" che gli avrebbe letto gli spazi ed ho pensato alla "gets" , perchè la uso personalmente :k:

Ultima modifica effettuata da jack92 il 15/08/2010 alle 11:01


"Il sapere umano appartiene al mondo"
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:21
Domenica, 15/08/2010
Riporto la funzìione:

Codice sorgente - presumibilmente VB.NET

  1. char *gets(char *s)/*<!-- Please don't change me without commenting on the Talk page. -->*/
  2.  {
  3.      int i, k = [[getchar]]();
  4.      /* Ritorna NULL se l'input non esiste */
  5.      if (k == EOF) return NULL;
  6.      /* Legge e memorizza i caratteri fino alla fine del file */
  7.      for (i = 0; k != EOF && k != '\n'; i++) {
  8.          s[i] = k;
  9.          k = getchar();
  10.          /* If a read error occurs, the resulting buffer is not usable. */
  11.          if (k == EOF && !feof(stdin)) return NULL;
  12.      }
  13.      /* Null-terminate and return the buffer on success.
  14.         The newline is not stored in the buffer. */
  15.      s[i] = '\0';
  16.      return s;
  17.  }


Il ciclo continua finchè k è diverso dal carattere '\n' o EOF, inoltre controlla che lo stream di input (stdin) sia diverso da EOF tramite la funzione feof ( vedi
http://www.cplusplus.com/reference/clibrary/cstdio/feof/&n ...; )

Ora, non essendo stato aperto nessun stream, tale controllo darà esito aleatorio.  
Fa terminare la funzione, restituendo NULL e non inserisce il carattere '\0' nel vettore passato.

In alternativa, si può semplificare in questo modo:

Codice sorgente - presumibilmente C++

  1. void LeggiFrase(char *s, int fine) // fine è la dimensione del vettore
  2. {
  3.    int i=0, k=0;
  4.    while ((k=getchar()) != '\n')
  5.    {
  6.        if (i<fine) s[i++]=k;
  7.    }
  8.    s[i]='\0';
  9. }




Ultima modifica effettuata da Poggi Marco il 15/08/2010 alle 14:47


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:06
Lunedì, 16/08/2010
mi da un problema... quando eseguo il programma non mi da tempo di inserire nessuna stringa... vi posto l'intero codice così provate se a voi da lo stesso errore:
Codice sorgente - presumibilmente C++

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <windows.h>
  4. #include <fstream.h>
  5. #include <string.h>
  6. #define N 117
  7.  
  8. using namespace std;
  9. char stringa[N];
  10. char stringa1[N*3];
  11. int num[N];
  12. int num1[N];
  13. int temp[N];
  14. int j=0;
  15. int g;
  16. int x=1;
  17. char scelta;
  18. char azzera;
  19. fstream dati;
  20. fstream dati1;
  21. string codici="";
  22. int redo;
  23.  
  24.  
  25. int main()
  26. {
  27.     do
  28.     {
  29.     cout<<"Azzerare Codice.txt?(1=s)(2=n)";
  30.     cin>>azzera;
  31.     if(azzera==49||azzera==50)
  32.     if(azzera==49)
  33.     {
  34.          dati1.open("Codice.txt",ios::out);
  35.          dati1.close();
  36.          redo=0;
  37.     }
  38.     else
  39.     {
  40.          dati1.open("Codice.txt",ios::in);
  41.          dati1>>codici;
  42.          dati1.close();
  43.          redo=0;
  44.     }
  45.     else
  46.     {
  47.          system("cls");
  48.          cout<<"Valore inserito errato"<<endl;
  49.          redo=1;
  50.     }
  51.     }while(redo);
  52.     dati.open("Codice.txt",ios::out);
  53.     dati<<codici<<endl;
  54.     cout<<"Sostituire agli spazi _"<<endl;
  55.     j=0;
  56.     for(int i=0;i<N;i++)
  57.     stringa[i]=0;
  58.     cout<<"Inserire stringa da codificare: ";
  59.     cin.getline(stringa,N);
  60.     for(int i=0;i<N;i++)
  61.     num[i]=stringa[i];
  62.     for(int i=0;i<N;i++)
  63.     if(num[i]!=0)
  64.     {
  65.                  num[i]=num[i]+58;
  66.                  num[i]=num[i]*2;
  67.     }
  68.     for(int i=0;i<N;i++)
  69.     if(num[i]!=0)
  70.     {
  71.        cout<<num[i];
  72.        dati<<num[i];
  73.     }
  74.     cout<<endl;
  75.     dati.close();
  76.     system("PAUSE");
  77. }



grazie...

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 14:23
Lunedì, 16/08/2010
Ciao! Ho letto il tuo programma, e ho trovato un semplice errore di gestione del buffer da tastiera.

Infatti quando richiedi il carattere azzera, solo il primo carattere viene memorizzato, mentre i successivi rimangono nel buffer.
Per ovviare al problema, basta aggiungere cin.ignore().



Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:49
Lunedì, 16/08/2010
Grazie :hail:
Finalmente funziona come volevo...
Scusate per il banale errore, ma sono ancora un principiante

PM Quote