PDA

View Full Version : [c] prendere stringa in input da tastiera


hurricane81
30-08-2007, 17:18
Ciao a tutti! Ho questo programma che prende in input una frase e la restituisce senza le s; esiste una frase di default e ho provato ad arricchirlo con la possibilità di scegliere la frase da tastiera; però non funziona: quando scelgo di cambiare frase, mi viene visualizzata la riga "inserisci nuova frase", quindi una riga bianca e poi il programma termina. dove sbaglio? (non posso usare scanf al posto di gets perchè devo prendere una frase, non una parola!)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char * cancella(char *str, char c)
{
int i, j=0;
char *app;
app=(char*) malloc(strlen(str)+1);
for (i=0; i<= strlen(str); ++i)
if (str[i]!=c)
app[j++]=str[i];
str=(char*) malloc(strlen(app)+1);
strcpy(str, app);
free(app);
return str;
}

main()
{
char x[2], y[100];
char a[]="s", b[]="n";

char *s="sschissa se ss s sfunzionassssss";
printf("La frase da esaminare è: %s\n", s);
printf("Vuoi cambiare la frase? s/n\n");
scanf("%s", x);
if (strcmp(x, b)==0)
printf("%s\n", cancella(s, 's'));
else if (strcmp(x, a)==0)
{
printf("Scrivi la nuova frase:\n");
gets(y);
printf("%s\n", cancella(y, 's'));
}
else
printf("Opzione non valida\n");
}

Ho quindi cercato di sostituire gets() con il seguente codice (definendo BUFSIZE=512 e naturalmente passando buffer e non y alla funzione cancella), ma il problema permane esattamente uguale!
char buffer[BUFSIZE];
char *p = NULL;
p = fgets (buffer, BUFSIZE, stdin);
if (!p)
{
fprintf(stderr, "Impossibile leggere la stringa (errore o EOF inatteso)\n");
exit (1);
}
/* Rimuove il newline finale o termina forzatamente la stringa */
p = (char *) memchr (buffer, '\n', BUFSIZE);
if (p == NULL)
buffer[BUFSIZE - 1] = '\0';
else
*p = '\0';

andbin
31-08-2007, 10:54
Ti posto la "mia" versione.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int input_line (char *buf, int bufsize)
{
char *p;

if (fgets (buf, bufsize, stdin) == NULL)
return 0;
if ((p = strchr (buf, '\n')) != NULL)
*p = '\0';

return 1;
}


char *strip_char (char *str, char c)
{
char *out;
int i, j, l = strlen (str);

if ((out = (char*) malloc (l+1)) == NULL)
return NULL;

for (i = j = 0; i < l; i++)
if (str[i] != c)
out[j++] = str[i];

out[j++] = '\0';

if ((str = (char*) realloc (out, j)) != NULL)
out = str;

return out;
}


int main (void)
{
char buf[80];
char *def = "sssprova sseliminaziones caratterisss";
char *str = NULL;

printf ("La frase da esaminare e`: \"%s\"\n", def);
printf ("Vuoi cambiare la frase? (s/n): ");

if (input_line (buf, sizeof (buf)))
{
if (strcmp (buf, "s") == 0)
{
printf ("Scrivi la nuova frase: ");

if (input_line (buf, sizeof (buf)))
str = buf;
}
else if (strcmp (buf, "n") == 0)
str = def;
else
printf ("Opzione non valida\n");

if (str != NULL)
{
str = strip_char (str, 's');

if (str != NULL)
printf ("Frase elaborata: \"%s\"\n", str);
}
}

return 0;
}
Come vedi, invece di usare un mix di scanf/gets (che sono molto problematiche) ho definito una semplice funzione di input di una riga, molto più comoda.