|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Problema con C
Ciao a tutti...
![]() Dovrei fare un programma che legga da tastiera un carattere, e se questultimo corrisponde a back space (praticamente quello di cancellatura in poche parole) "torna indietro", per capirci meglio ecco il sorgente cannato: Codice:
#include <stdio.h> int main() char car; int num; printf(">>inserire un carattere:"); scanf("%c",&car); num=car-'0'; if(num==10) return 6; else{ printf("\n>>Carattere accettato"); while(getchar()!='\n'); } getchar(); return 0; } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
guarda forse non ho capito bene io cmq il controllo che dovresti fare è
if (car==10)... |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1661
|
detto...fatto!
Premesso che non ho guardato il suo sorgente, per fare quello che serve a te bastano queste poche righe di codice:
Codice:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int insCharASCII; do{ printf("\nInserisci un carattere: "); insCharASCII=getchar(); } while(insCharASCII==8); system("PAUSE"); return 0; } ![]() Se al posto di voler fare ripetere il programma quando premi backspace (ASCII=8) lo vuoi fare ripetere con un qualunque altro tasto, ad esempio lo spazio (ASCII=20), funziona benissimo. Qual'è allora il problema? Il dos non riconosce backspace come un carattere inserito (o meglio lo riconosce, ma in qualche modo lo bypassa identificandolo come un "cancella il carattere precedente al cursore"). Spero di essere stato abbastanza chiaro...in ogni caso il programma che devi fare tu, si può fare benissimo in assembler: Codice:
cseg segment para public 'code' assume cs:cseg, ds:dati,es:dati,ss:stack init proc far mov ax,dati mov ds,ax mov es,ax ;*************************************** inizioPr: mov bx,offset stringa printText: mov dl,[bx] cmp dl,00h je insCaract call stampaVideo inc bx jmp printText insCaract: call insChar call insRiga cmp al,8h je inizioPr ;***************************************** fine_programma: ret_cd equ 0 ret_fn equ 4ch mov ax,ret_fn*256+ret_cd int 21h init endp ;***************************************** ;* PROCEDURA "insRiga" ;* Questa procedura stampa una riga vuota ;* in modo da poter andare a capo. ;***************************************** insRiga proc near push ax push dx mov ah,2 mov dl,0dh int 21h mov dl,0ah int 21h pop dx pop ax ret insRiga endp ;***************************************** ;* FINE PROCEDURA "insRiga" ;***************************************** ;***************************************** ;* PROCEDURA "stampaVideo" ;* Questa procedura stampa a video il ;* simbolo del codice ascii contenuto in DL ;***************************************** stampaVideo proc near push ax mov ah,2 int 21h pop ax ret stampaVideo endp ;***************************************** ;* FINE PROCEDURA "stampaVideo" ;***************************************** ;***************************************** ;* PROCEDURA "insChar" ;* Questa procedura legge un carattere da ;* tastiera e lo memorizza nel registro AL ;***************************************** insChar proc near mov ah,1 int 21h ret insChar endp ;***************************************** ;* FINE PROCEDURA "insChar" ;***************************************** cseg ends ;***************************************** dati segment para public 'dati' stringa db 1 dup ("Inserisci un carattere: ") dati ends ;***************************************** stack segment para stack 'stack' db 64 dup ("stack ") stack ends ;***************************************** end init ;***************************************** ![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
è possibile inserire quel programma come blocco asm in un programma C? purtroppo sono totalmente ignorante in materia per cui se ho detto una minchiata non subissatemi di lattuga, pomodori e uova marce...
![]() |
![]() |
![]() |
![]() |
#7 | |||
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Invece, le varie scanf, getchar (che ti consiglio di usare: a proposito, getchar deve poter restituire EOF che è un valore diverso da ogni altro carattere, quindi il tipo restituito è int e non char) e famiglia, sono funzioni di input bufferizzato, ossia vengono eseguite quando le operazioni di riempimento di una zona di memoria dedicata allo scopo (il buffer, appunto) sono terminate, evento quest'ultimo normalmente corrispondente (nell'input da tastiera) alla pressione del tasto Invio. E in effetti, nel tuo listato tu aggiri il problema leggendo solo il primo carattere di ogni sequenza che inserisci. Ora, la libreria standard del C contiene solo funzioni per l'I-O bufferizzato, per il semplice fatto che questo è portabile e l'altro no. Perciò, se vuoi fare una cosa pulita, devi ricorrere a librerie apposite per il compilatore e il sistema operativo con cui lavori, ad esempio conio sotto DOS o ncurses sotto Linux. Quote:
Per il backspace, devi usare o il codice ASCII 127, oppure la costante '\b'. Quote:
Codice:
if (car>='0' && car<='9') P.S.: comunque è tutto scritto nel K&R.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|||
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1661
|
ecco..ziosilvio ti ha spiegato meglio perchè non funziona con backspace
![]() |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Grazie a tutti..allora..
1)Quello stronzo del mio prof mi ha detto che backspace corrispondea 10 ![]() 2)Mi ha anche spiegato che : Codice:
int num=carattere(char)-'0'; 3)Poi non ho capito: Codice:
if (car>='0' && car<='9') 4)Quindi se uso la conio.h e uso getchar() e putchar() potrebbe funzionare??..(infatti il programma partiva ma prima di andare avanti dovevo premere invio ![]() |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Ok avevi ragione
![]() |
![]() |
![]() |
![]() |
#11 | |||
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
![]() Quote:
ti fornisce il valore numerico, a patto che il carattere sia compreso tra '0' (0x30) e '9' (0x39), altrimenti non ha senso. Quote:
Sono due cose leggermente diverse: il backspace (8) porta indietro solo il cursore (quindi non cancella il carattere precedente) mentre il delete (127) cancella a tutti gli effetti il carattere precedente (proprio come se tu premessi il tasto di cancella che c'è nelle tastiere sopra l'enter). Tiene presente anche che, da quello che ho potuto sempre constatare io, su linux il 127 si comporta effettivamente come delete mentre sulla console di Windows, il 127 stampa un carattere grafico.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|||
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Ora mi è tutto chiaro....manca solo una cosa per completare quel maledetto codice:COME SI FA A TORNARE INDIETRO NEL PROGRAMMA??...con return non và..nessuna sa come si fa??...
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Nel senso che se si digita backspace il programma "torna alla riga 6" dove viene chiesto di nuovo di iserire il carattere...non so se sia possibile ma però mi sembra di aver letto in un codice una cosa simile..
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Comunque se vuoi che ci sia un ciclo, cioè che una parte del codice venga rieseguita in base ad una determinata condizione, devi usare il costrutto while o il do-while (nel tuo caso penso sia meglio quest'ultimo).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 03-12-2005 alle 19:44. |
|
![]() |
![]() |
![]() |
#16 | ||
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
Quote:
![]() |
||
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#18 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Chiedo scusa per l'imprecisione. A proposito: backspace ha il codice ASCII decimale 8, quindi il suo valore numerico ottale è 010: per cui, è possibile che il prof di Gino+89+ abbia letto la colonna sbagliata...
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#19 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Per cui, nel tuo caso doversti sostituire: Codice:
printf(">>inserire un carattere:"); scanf("%c",&car); if(car=='\b') return 6; Codice:
insert_char: printf(">>inserire un carattere:"); scanf("%c",&car); if(car=='\b') goto insert_char; Studia bene, sul tuo libro, la parte relativa ai cicli (while, do-while, e for), incluse le istruzioni break e continue.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Mitico Ziosilvio!!..proprio goto..ora ricordo...infatti mi sembrava di averla gia vista sta cosa...mi serve questo perchè devo fare un programma che funge come una specie di prompt dei comandi e inserire ogni volta cicli non finisco più..ok..grazie a tutti!!!!
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:37.