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

    [C] stringa con spazi da input

    Ciao ragazzi.
    Ho bisogno di prendere una stringa da input e che possa contenere anche spazi. L'usatissimo e standard scanf mi sa che non è utile per questo utilizzo e quindi conviene seguire carattere per carattere. La funzione adatta dovrebbe essere getchar.

    codice:
    for (i=0;((ch=getchar()) == '\n') && (i<20);i++)
          n[i]=ch;
    n[i]= '\0';
    Questo a mio avviso dovrebbe essere la parte di codide adatta alla scrittura di stringhe con getchar. Ovviamente le variabili sono già state dichiarate prima.
    Solo che non funziona. Dopo aver schiacciato invio mi salta molte istruzione successive.
    Se è necessari posto tutto il codice.

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    secondo me è sbagliata la condizione d'uscita dalla for.. quell "==" e l'and "&&"
    ricontrolla la logica

  3. #3
    se scrivo "!=" mi salta proprio l'istruzione in questione e passa a quella successiva.

  4. #4
    Perché ti complichi la vita quando c'è già la funzione fgets pronta all'uso?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Ma per usare fgets devo creare ed aprire un file. Se in caso non mi interessa il file?!

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Metti stdin come primo argomento
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  7. #7
    Niente. Ho usato getchar, getc, gets, fgets. Non riesco a far funzionare questa istruzione ed ormai dopo due giorni sono entrato nel baldassone e sto uscendo pazzo.

    Posto il codice. Se qualcuno di buona volontà ha la voglia di modificare la parte che mi serve in modo tale da farmi vedere dove sbaglio, ne sarei contento.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define ELEM 100
    #define NCHAR 20
    
    // Definizione della struttura
    typedef struct {
    					char nome[NCHAR];
    					char cognome[NCHAR];
    					char telefono[NCHAR];
    					char citta[NCHAR];
    		       } account;
    
    // Variabili globali
    account rubrica[ELEM];
    int num_account = 0;
    
    // Dichiarazione delle funzioni
    void InsContatto (char nom[], char cogn[], char tel[], char cit[]);
    void ModContatto (char nom[], char cogn[]);
    void Cancella (char nom[], char cogn[]);
    void Visualizza (char nom[], char cogn[]);
    
    int main()
    { //OPEN main
         short int scelta, i; /* per inserire la scelta del men˘ */
         char n[NCHAR]; /* per inserire il nome */
         char m[NCHAR]; /* per inserire il cognome */
         char c[NCHAR]; /* per inserire la citt‡ */
         char t[NCHAR]; /* per inserire il numero di telefono */
         char ch = '\0';
         for (;scelta!= 0;)
         { //OPEN for
        	  printf ("\nLorenzo Carnevale\n");
        	  printf ("Rubrica V 1.0\n\n");
              printf ("\t\t  INDEX\n");
              printf ("\t***************************\n");
              printf ("\t* 1 - Inserisci Contatto  *\n");
              printf ("\t* 2 - Modifica Contatto   *\n");
              printf ("\t* 3 - Cancella Contatto   *\n");
              printf ("\t* 4 - Visualizza Contatto *\n");
              printf ("\t*                         *\n");
              printf ("\t* 0 - Esci dal programma  *\n");
              printf ("\t***************************\n\n");
              printf ("Digita: ");
              scanf ("%hd", &scelta);
              switch (scelta)
              { //OPEN switch
                     case 0: // Exit
                               printf ("\n\t\tGrazie per la scelta\n\n");
                               break;
                     case 1: // Inserisci contatto
                               printf ("\nNome: ");
                               for (i=0;(i<20) && ((ch=getchar())!='\n');i++)
                            	   if (ch != '\b') n[i] = ch;
                               n[i] = '\0';
                               printf ("Cognome: ");
                               scanf ("%s", m);
                               printf ("Telefono: ");
                               scanf ("%s", t);
                               printf ("Citta': ");
                               scanf ("%s", c);
                               printf ("\n");
                               InsContatto(n,m,t,c);
                               break;
                     case 2: // Modifica Contatto
                               printf ("\nNome: ");
                               scanf ("%s", n);
                               printf ("Cognome: ");
                               scanf ("%s", m);
                               ModContatto (n,m);
                               break;
                     case 3: // Cancella
                               printf ("\nNome: ");
                               scanf ("%s", n);
                               printf ("Cognome: ");
                               scanf ("%s", m);
                               Cancella (n,m);
                               break;
                     case 4: // Visualizza
                               printf ("\nNome: ");
                               scanf ("%s", n);
                               printf ("Cognome: ");
                               scanf ("%s", m);
                               Visualizza (n,m);
                               break;
              } //CLOSED switch
        } //CLOSED for
        return 0;
    } //CLOSED main
    
    // Definizione delle funzioni
    void InsContatto (char nom[], char cogn[], char tel[], char cit[])
    { //OPEN InsContatto
         int i;
         if (num_account == ELEM)
         { //OPEN if
             printf ("Hai raggiunto il limite di contatti offerto\n\n");
             return;
         } //CLOSED if
         for (i=0; i<=num_account; i++)
         { //OPEN for
             if ((strcmp (nom,rubrica[i].nome)==0) && (strcmp (cogn,rubrica[i].cognome)==0))
             { //OPEN if
                printf ("Nome e Cognome utente esistono in memoria\n\n");
                return;
             } //CLOSED if
         } //CLOSED for
         strcpy (rubrica[num_account].nome,nom);
         strcpy (rubrica[num_account].cognome,cogn);
         strcpy (rubrica[num_account].telefono,tel);
         strcpy (rubrica[num_account].citta,cit);
         num_account++;
         return;
    } //CLOSED InsContatto
    
    void ModContatto (char nom[], char cogn[])
    { //OPEN ModContatto
         int i;
         for (i=0; i<=num_account; i++)
         { //OPEN for
             if ((strcmp (nom,rubrica[i].nome)!=0) && (strcmp (cogn,rubrica[i].cognome)!=0))
             { //OPEN if
                printf ("Il contatto non esiste");
                printf ("\n\n");
                return;
             } //CLOSED if
             else
             { //OPEN else
                 printf("Nuovo Nome: ");
                 scanf("%s", rubrica[i].nome);
                 printf("Nuovo Cognome: ");
                 scanf("%s", rubrica[i].cognome);
                 printf("Nuovo Telefono: ");
                 scanf("%s", rubrica[i].telefono);
                 printf("Nuova Citta': ");
                 scanf("%s", rubrica[i].citta);
                 return;
             } //CLOSED else
         } //CLOSED for
    } //CLOSED ModContatto
    
    void Cancella (char nom[], char cogn[])
    { //OPEN cancella
         int i;
         for (i=0; i<=num_account; i++)
         { //OPEN for
             if ((strcmp (nom,rubrica[i].nome)!=0) && (strcmp (cogn,rubrica[i].cognome)!=0))
             { //OPEN if
                printf ("Il contatto non esiste");
                printf ("\n\n");
                return;
             } //CLOSED if
             else
             { //OPEN else
                rubrica[i].nome[0] ='\0';
                rubrica[i].cognome[0] ='\0';
                rubrica[i].telefono[0] ='\0';
                rubrica[i].citta[0] ='\0';
                return;
             } //CLOSED else
         } //CLOSED for
    } //CLOSED Cancella
    
    void Visualizza (char nom[], char cogn[])
    { //OPEN Visualizza
         int i;
         for (i=0; i<=num_account; i++)
         { //OPEN for
             if ((strcmp (nom,rubrica[i].nome)==0) && (strcmp (cogn,rubrica[i].cognome)==0))
             { //OPEN if
                printf ("Il contatto scelto e': \n");
                printf ("\n%s %s\n", rubrica[i].nome, rubrica[i].cognome);
                printf ("%s\n%s", rubrica[i].telefono, rubrica[i].citta);
                printf ("\n\n");
                return;
             } //CLOSED if
             else
             { //OPEN else
                printf ("Il contatto non esiste");
                printf ("\n\n");
                return;
             } //CLOSED else
         } //CLOSED for
    } //CLOSED Visualizza
    Il ciclo getchar è solo nella prima istruzione possibile, le altre non le ho modificate.

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.