Ciao a tutti!
Per risolvere un determinato problema ho scritto la seguente funzione:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h> //Per getch()
#include <ctype.h>
void charcoun(char *, int , int , int );
void message(int );
int Bkspace(char *, int, int );
void read(int , char *, int );
int main(void)
{
char *a=NULL;
char *b=NULL;
char *c=NULL;
a=(char *)calloc(20, sizeof(char));
b=(char *)calloc(30, sizeof(char));
c=(char *)calloc(40, sizeof(char));
message(1);
read(20, a, 1);
system("cls");
message(2);
read(30, a, 2);
system("cls");
message(3);
read(40, a, 3);
system("cls");
printf("\na: %s\n", a);
printf("\nb: %s\n", b);
printf("\nc: %s\n\n\n", c);
system("pause");
return 0;
}
//Legge dallo standard input una striga di
//"max" caratteri.
void read(int max, char *data, int id)
{
char c;
char *stream;
int j=0, k=max; //k=caratteri disponibili per l'input!
//Alloco lo spazio per l'input
stream=(char *) calloc(max, sizeof(char));
while(1) {
c=getch(); //Legge dallo standard input un carattere
stream[j]=c;
putch(c);
//Se l'utente preme invio termina la fase di input.
if(c==13) {
stream[j]='\0';
strcpy(data, stream);
return;
}
//Alla pressione di BACKSPACE occorre cancellare
//l'ultimo carattere inserito!
if(c==8) {
if(j!=0)
k++; //incremento k!
j=Bkspace(stream, j, id);
continue;
}
//Se l'utente supera il numero di caratteri disponibili per l'input
//il ciclo termina.
if(j==max) {
printf("\t > Errore. Puoi scrivere massimo %d caratteri!", max);
stream[j]='\0';
strcpy(data, stream);
printf("\n\n\n");
system("pause");
return;
}
charcoun(stream, k, max, id); //Stampa il numero di caratteri disponibili
//per l'input.
j++;
k--;
}
}
//Stampa il numero di caratteri ancora disponibile
//per l'input.
void charcoun(char *stream, int k, int max, int id)
{
int j=0;
system("cls");
message(id);
//Ristampa sullo standard output la stringa stream.
while((stream[j]!='\0') && (j<max)) {
putch(stream[j]);
j++;
}
if(k>0) {
printf("\n\n\n\n");
printf("%d caratteri rimanenti", k-1);
}
}
//backspace.
int Bkspace(char * stream, int k, int id)
{
int j=0;
if(k!=0) {
stream[k]='\0'; //Cancello l'ultimo elemento inserito;
k--;
}
system("cls");
//Ristampa sullo standard output la stringa stream
message(id);
while(j!=k) {
putch(stream[j]);
j++;
}
return k;
}
//La funzione message() stampa sullo standard output il messaggio
//corrispondente al valore contenuto nella variabile id.
void message(int id)
{
switch(id) {
case 1: printf("Inserire il soggetto > ");
break;
case 2: printf("Inserire commento > ");
break;
case 3: printf("Inserire scadenza [gg/mm/aaaa] > ");
break;
}
}
La funzione read(...) in particolare legge dallo standard input una stringa sfruttando la funzione di libreria getch!
Provando la funzione (ho postato anche il main da me utilizzato per testarla) però ho notato che porta a termine SOLO il primo input. Come mai? Il problema dovrebbe esser dovuto alla funzione getch() da me utilizzata ma non capisco il perchè .
Qualche suggerimento? PLZ!