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++ - Aiuto per esercizio semplicissimo
Forum - C/C++ - Aiuto per esercizio semplicissimo

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Manu89 (Normal User)
Newbie


Messaggi: 12
Iscritto: 07/09/2009

Segnala al moderatore
Postato alle 0:19
Sabato, 19/09/2009
Ciao! Scusate, mi dispiace aprire un topic per questa stupidata, però non ci arrivo proprio. Sto cercando di imparare il C con un manuale molto gradualmente e sto partendo proprio dalla base. Questo è uno degli esercizi proposti nei primi capitoli, e già non riesco a farlo funzionare -.- e sono solo 20 righe di codice. Per favore, potreste dargli una controllata?

Una cosa riguardo lo stile: so che è poco elegante, sto cercando di migliorare. La condizione if è troppo limitativa, però non sapevo come impostarla per fargli capire che deve accettare un solo carattere ASCII. per esempio, il carattere '#' mi fa uscire dal programma e non so perchè. Vabbè, grazie in anticipo.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int main(int argc, char** argv){
  4.         char car,cont;
  5.         if(argc<2){
  6.                 printf("Inserite un carattere ASCII ed uno soltanto\n\n** Uscita dal programma **");
  7.                 exit(1);
  8.         }
  9.         car = argv[1][0];
  10.         printf("Corrispettivo numero ASCII\n");
  11.         printf("Carattere: %c\t Numero: %d",car,car);
  12.         printf("\n\nContinuare (Y/N)? ");
  13.         scanf("%c",&cont);
  14.         while(cont=='Y' || cont=='y'){
  15.                 printf("Inserire un'altro carattere:");
  16.                 scanf("%c",&car);
  17.                 printf("\nCarattere: %c\t Numero: %d",car,car);
  18.                 printf("\n\nContinuare (Y/N)? ");
  19.                 scanf("%c",&cont);
  20.         }
  21.         printf("\n\nFine.\n");
  22.         return 0;
  23. }


PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 1:01
Sabato, 19/09/2009
Ciao, il problema era piuttosto sottile...
L'errore principale stava nella funzione scanf. La funzione scanf non è buona per leggere i caratteri perchè genera problemi (come in questo caso) con gli spazi e gli a capo.
Quando tu dai un imput al tuo programma in realtà gli passi + caratteri di quanti pensi.
Per esempio: passi il carattere 'c' e batti invio. In realtà passi due caratteri, il carattere 'c' e il carattere newline '\n'.
la funzione scanf (quando legge un carattere) legge e memorizza il carattere 'c' ma lascia nello stream di input il carattere '\n', il quale verrà ripescato dalla prossima funzione scanf che cerca di leggere un carattere. Ovviamente crea un po di problemi...
Per risolvere il problema o usi un'altra funzione di lettura input da tastiera (ce ne sono tante) o usi scanf in questo modo:
Codice sorgente - presumibilmente Plain Text

  1. scanf(" %c", %variable);


Inserendo questo carattere spazio dici alla funzione scanf di ignorare tutti i caratteri blank, e risolvi il problema.

Ecco il codice funzionante:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int main(int argc, char** argv){
  4.     char car,cont;
  5.     if(argc<2)
  6.     {
  7.         printf("Inserite un carattere ASCII ed uno soltanto\n\n** Uscita dal programma **");
  8.         return(-1);
  9.     }
  10.     car = argv[1][0];
  11.     printf("Corrispettivo numero ASCII\n");
  12.     printf("Carattere: %c\t Numero: %d",car,car);
  13.     printf("\n\nContinuare (Y/N)? ");
  14.     scanf("%c",&cont);
  15.     car=0;
  16.     do
  17.     {
  18.         printf("Inserire un'altro carattere:");
  19.         scanf(" %c",&car);
  20.         printf("\nCarattere: %c\t Numero: %d",car,car);
  21.        
  22.         printf("\n\nContinuare (Y/N)? ");
  23.         scanf(" %c",&cont);
  24.     }
  25.     while(cont=='Y' || cont=='y');
  26.    
  27.     printf("\n\nFine.\n");
  28.     scanf("%c",&car);
  29.     return 0;
  30. }


Ultima modifica effettuata da Matthew il 19/09/2009 alle 1:02


"I have never let my schooling interfere with my education." Mark Twain
PM Quote
Avatar
Manu89 (Normal User)
Newbie


Messaggi: 12
Iscritto: 07/09/2009

Segnala al moderatore
Postato alle 11:41
Sabato, 19/09/2009
Ti ringrazio, mi avevano spiegato questo problema di scanf che infatti è meglio sostituire con altre funzioni (forse getchar() è meglio?!), come ho fatto a non pensarci... grazie.

Comunque, ora vorrei capire un'altra cosa. Perchè se nella riga di comando scrivo (l'eseguibile si chiama ascii.exe) "$ ./ascii #" mi esce dal programma mentre con tutti gli altri caratteri no? Come potrei migliorare la condizione dell'if?

Ultima modifica effettuata da Manu89 il 19/09/2009 alle 12:01
PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 19:07
Sabato, 19/09/2009
A dire il vero non so come risolvere questo problema. Tu usi Linux vero?
Io ho provato a passare come argomento '#' su Windows e funziona.
Su linux il carattere '#' è un carattere speciale che indica che stai scrivendo un commento.
Non credo quindi che tu lo possa passare come argomento. Di sicuro non lo puoi passare così.


"I have never let my schooling interfere with my education." Mark Twain
PM Quote
Avatar
Manu89 (Normal User)
Newbie


Messaggi: 12
Iscritto: 07/09/2009

Segnala al moderatore
Postato alle 19:26
Domenica, 20/09/2009
Ciao! Scusate, ho bisogno per un altro esercizio, ma non volevo aprire un altro topic, tanto si tratta sempre di un problema semplice 8-|
Cosa c'è che non va in questa porzione di codice da me scritta?
Se c'è bisogno dell'intero codice (ma non credo..) ve lo posto. Gli errori si trovano tutti sugli assegnamenti, e sono tutti uguali.

Codice sorgente - presumibilmente C++

  1. char* rdigit(char u, char q, char d, int n){
  2.         char *r;
  3.         switch(n){
  4.                 case 1:
  5.                         r[]={u,'\0'};
  6.                         break;
  7.                 case 2:
  8.                         r[]={u, u, '\0'};
  9.                         break;
  10.                 case 3:
  11.                         r[]={u, u, u, '\0'};
  12.                         break;
  13.                 case 4:
  14.                         r[]={u, q, '\0'};
  15.                         break;
  16.                 case 5:
  17.                         r[]={q,'\0'};
  18.                         break;
  19.                 case 6:
  20.                         r[]={q, u, '\0'};
  21.                         break;
  22.                 case 7:
  23.                         r[]={q, u, u, '\0'};
  24.                         break;
  25.                 case 8:
  26.                         r[]={q, u, u, u, '\0'};
  27.                         break;
  28.                 case 9:
  29.                         r[]={u, d, '\0'};
  30.                         break;
  31.         }
  32.         return r;
  33. }


PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 21:27
Domenica, 20/09/2009
Gli array non funzionano così in C.
La memoria non viene allocata automaticamente, devi farlo tu. E l'inizializzazione degli array non si fa in quel modo.
Prenditi un bel manuale di C e studia il capitolo sugli array...


"I have never let my schooling interfere with my education." Mark Twain
PM Quote
Avatar
Manu89 (Normal User)
Newbie


Messaggi: 12
Iscritto: 07/09/2009

Segnala al moderatore
Postato alle 10:17
Lunedì, 21/09/2009
Ho provato anche a dargli una dimensione direttamente, ma il problema rimane uguale... Ho usato anche la malloc, e poi anche la chiamata per riferimento... Poi comunque mi segnala errore di sintassi (parse error, credo di questo si tratti), e non segmentation fault e altre cose relative all'accesso in memoria...

Comunque lo sto usando il manuale del C, e mi sembrava corretto inizializzarli così, l'ho visto fare.

Ultima modifica effettuata da Manu89 il 21/09/2009 alle 10:30
PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 18:40
Lunedì, 21/09/2009
Così non è corretto, questo e poco ma sicuro... :rotfl:
parse error hai detto? Probabilmente non hai convertito il tipo di puntatore...
La funzione malloc restituisce un puntatore di tipo void, se vuoi allocare spazio per un'array di caratteri devi convertire il puntatore restituito da malloc.
Codice sorgente - presumibilmente C/C++

  1. char *array;
  2. array = (char *)malloc(size);



Altrimenti puoi dichiarare l'array così...
Codice sorgente - presumibilmente C/C++

  1. char arr[3];


In tal modo ottieni un array di caratteri a cui sono assegnati 3 bytes di memoria


"I have never let my schooling interfere with my education." Mark Twain
PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 19:12
Lunedì, 21/09/2009
Postato originariamente da Lawliet:

Testo quotato

Postato originariamente da Manu89:
Gli errori si trovano tutti sugli assegnamenti, e sono tutti uguali.


Ma quali errori? Parli di questo pezzettino di codice?
Codice sorgente - presumibilmente Plain Text

  1. r[]={u,'\0'};


Io non ho mai visto che si assegna così.. anche perchè io facevo tipo così:
Codice sorgente - presumibilmente Plain Text

  1. r = "u";
  2. r = "uu";

e basta (si potrebbe fare quando utilizzi i puntatori, comunque, ma è sconsigliata e quindi meglio sempre dare una dimensione agli array dato che sei pure agli inizi da quello che ho capito). Un'altra cosa, che errore di preciso ti dà?

EDIT: aspetta! Ora che vedo meglio, u e q sono variabili!! Quindi devi concatenare, attraverso funzioni strcat.

Ultima modifica effettuata da Lawliet il 21/09/2009 alle 20:08


"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
cit. theprogrammer
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo