PDA

Visualizza la versione completa : [c] problema lettura stringa


trafalguar
27-08-2008, 23:47
Sto sviluppando un applicazione client/server ed ho un problema quando devo leggere un nick.. più che un problema è un dettaglio che però mi infastidisce.. mi spiego meglio.. il codice nel client è questo:


printf("Inserisci il nickname con cui vuoi giocare:\n");
LetturaStringa ( Nick, 20 );

questo funziona, ma standoci lo \n al termine del printf praticamente il nickname viene scritto nella riga successiva.. io invece vorrei che fosse inserito sulla stessa riga.. quindi ho pensato di modificare così:


printf("Inserisci il nickname con cui vuoi giocare: ");
LetturaStringa ( Nick, 20 );

ma facendo in questo modo non funziona.. cioè non esce scritto niente, e dopo che ho scritto il nick e dato l'invio, esce scritto "Inserisci il nickname con cui vuoi giocare: " quando invece dovrebbe uscire prima.. il codice della funzione LetturaStringa è il seguente:


void LetturaStringa ( char Stringa[], int MaxLen ) {
char Carattere;
int Indice = 0;
// Leggo un carattere alla volta dalla shell finchè non viene premuto il tasto INVIO
// oppure accade qualche errore. I primi 20 caratteri vengono inseriti nell'array del Nick.
while ( read ( STDIN_FILENO, &Carattere, 1) > 0 && Carattere != '\n' )
{
if ( Indice < MaxLen - 1)
Stringa[Indice++] = Carattere;
}
Stringa[Indice] = '0';
// prima dello zero c'è backslash.. non l'ho inserito perchè qui sul forum backslash0 faceva vedere una cosa strana come questa \0
}

qualcuno sa spiegarmi il perchè di questo comportamento anomalo? e come posso ovviare a tale inconveniente? grazie

trafalguar
28-08-2008, 10:19
sostituendo la funzione LetturaStringa di cui su, con questa:


void LetturaStringa ( char Stringa[], int MaxLen)
{
int i;

fgets (Stringa,MaxLen,stdin);
i = strlen(Stringa) -1;
if (Stringa[i]<32) Stringa[i]=0;

// fflush(stdin);

}

funziona.. ma qualcuno sa spiegarmi il perchè prima non funzionava? E in questa il fflush alla fine ci vuole o non ci vuole?

:ciauz:

SergiusXP
28-08-2008, 13:47
Ma mi sorge un dubbio..

Non avresti potuto semplicemente scrivere:



printf("Inserisci il nickname con cui vuoi giocare:\n");
scanf("%s",nick);


:D

trafalguar
28-08-2008, 14:05
mi aspettavo questa risposta.. ed ho sbagliato a non chiarirlo prima..
non ho usato semplicemente scanf perchè se venivano inseriti più di 20 caratteri, restavano dei caratteri nel buffer ed in questo modo c'era la possibilità di alterare le successive letture di stringhe..

menphisx
28-08-2008, 14:26
void getline(char *pStr, size_t maxBytes){

if(pStr == NULL)
return;

while((*pStr++ = getchar()) != '\n' && maxBytes-- >= 0)
;

/*Oppure usa fflush(stdin)*/
if(maxBytes <= 0){

while(!getchar());

}

*pStr = '\0';

}


:ciauz:

trafalguar
28-08-2008, 15:09
non ho capito la linea /*Oppure usa fflush(stdin)*/

e comunque.. il problema l'ho risolto.. ora funziona.. quello che chiedo è perchè la prima funzione postata non funziona.. e come si può modificarla (se si può) per farla funzionare (modificarla, non scriverne un'altra)..

Andrea Simonassi
28-08-2008, 17:29
la funzione funzionava, devi sapere che printf lavora su un file bufferizzato e quindi fa flush quando piu le garba... se fai un flush di stdout dopo avere fatto printf funziona anche la tua vecchia funzione

trafalguar
28-08-2008, 19:24
ora provo.. grazie per la spiegazione!!

Loading