Newsgroup: it.comp.lang.c
Titolo: problema con le stringhe....

Salve a tutti.
ho scritto questo breve programma:
int main(){
  int i=0;
  char str[50];
  char c;
  char *command;
  strcpy (command,"prova");
  while (c!='\n'){
    c=getchar();
    str[i]=c;
    i++;
  }
  printf ("\nstr: %s\n",str);
   if (strcmp(str,command)==0) printf ("\nhai scritto '%s'!!!\n,command");
  system("PAUSE");
  return 0;
}
lo scopo sarebbe quello di agire in presenza di una determinata stringa,
ma il problema è che su "str" restano una marea di caratteri inutili.
Come li posso eliminare? mi servirebbe avere esattamente quello che ho
scritto.
inoltre non posso usare scanf, perchè in realtà recevo i caratteri ad uno ad
uno
tramite una socket (sto realizzando una specie di server telnet)...
Altrimenti come potrei fare?
grazie a tutti
    Stefano

   strcpy (command,"prova");
mi sono fermato a leggere a questa riga sopra, che e'
sbagliata.
Hai dichiarato un puntatore command ma devi fare anche in modo
che questo puntatore punti ad una zona di memoria.
Cosi' contiene un valore casuale e quando copi
  strcpy (command,"prova");
stai scrivendo "prova" in una zona casuale di memoria.
Per allocare memoria o lo fai in mddo statico:
char command[80];
o in modo dinamico usando la funzione malloc.
ciao,
g.

"Giovanni Resta" <g.r...@iit.cnr.it.nospam> ha scritto nel messaggio
news:btmgnl$r6s$1...@newsfeed.cineca.it...

eppure quello funziona benissimo.
Comunque ho fatto come hai detto tu (lo avevo già fatto con str),
e il problema, chiaramente rimane...
non so proprio dove sbattere la testa.
grazie ancora

 e il problema, chiaramente rimane...
Funzionava benissimo per puro caso. Prima o poi
ti avrebbe fatto crashare tutto il programma.
Comunque leggendo sotto vedo almeno altri tre errori:
1) non scrivi uno zero per terminare la stringa str,
e quindi (ovviamente) quando stampi str stampi tutta quello
che si trova prima del primo 0 (che sara' in qualche posto
a caso).
2) non inizializzi il carattere c, che quindi
puo' contenere qualunque cosa, e potrebbe,
per puro caso contenere proprio '\n',
con le conseguenze del caso.
3) non prendi in considerazione che se uno immette
piu' di 50 caratteri prima del \n vai a scrivere
fuori da str, con conseguenze imprevedibili.
ciao,
g.

 a caso).
Infatti, solo come faccio a terminarla con zero?
in effetti il while termina quando viene premuto invio.
Non capisco da dove piovano gli altri caratteri.
 tu come faresti?
grazie

  tu come faresti?
scusa la franchezza, ma non e' meglio apri un manuale
di C e ti studi un po' le strighe (ovvero gli array
di caratteri terminati da uno 0) ?
Se non sai rispondere ad una domanda come questa non vedo
come puoi programmare alcunche'.
Comunque, nel tuo ciclo while prima metti il carattere in str[i]
poi incrementi i e poi confronti il carattere con '\n'.
quindi quando esci dal while avrai ad esempio
str[0]='p'
str[1]='i'
str[2]='p'
str[3]='p'
str[4]='o'
str[5]='\n'
e la variabile i varra' 6 (perche' viene incrementata dopo l'uso).
Siccome e' ragionevole pensare che non ti serva a niente tenere
il carattere '\n' in fondo alla stringa, puoi sovrascriverlo con
uno 0 per indicare che la stringa finisce li.
quindi devi aggiungere, subito dopo la fine del ciclo while
(cioe' prima della printf ("\nstr: %s\n",str); )
l'istruzione
str[i-1]=0;
ciao,
g.

 str[i-1]=0;
...
Per i puristi sarebbe piu' corretto
str[i-1]='\0';
Giorgio

   if (strcmp(str,command)==0) printf ("\nhai scritto '%s'!!!\n,command");
ERRORE!
command deve stare fuori dalle virgolette, non dentro! Correggiamo anche
questo:
 if (strcmp(str,command)==0) printf ("\nhai scritto '%s'!!!\n",command);
cosi' dovrebbe andare meglio!
In pratica la versione corretta e':
<CODE>
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int i=0;
    char str[50]="";
    char c;
    char *command="prova";
    for(;;){
        c=getchar();
        if((c=='\n')||(i>=50)) break;
        str[i]=c;
        i++;
    }
    printf ("\nstr: %s\n",str);
    if(strcmp(str,command)==0){
        printf ("\nhai scritto '%s'!!!\n",command);
    }
    system("PAUSE");
    return 0;
}
</CODE>
Ora.... ad essere sincero... non e' che sia ben programmata... ho solo
corretto i tuoi errori.
Ci sarebbero modi migliori per fare cio', ma intanto studiati bene i tuoi
errori e cerca di capirli!
Oltre a questo tutto il tuo codice non e' molto ben programmato.. ti
consiglio, se gia' non lo stai facendo di (ri)-studiarti il C su di un buon
libro.
Tommy

     }
str[i]='\0';
nota che ho modificao il >=50 a >=49, questo per permettere un:
str[49]='\0';
nel caso la stringa sia troppo lunga.
Ad ogni modo riamane sempre un progamma pessimo e concordo con Giovanni
quando dice:
<QUOTE>
scusa la franchezza, ma non e' meglio apri un manuale
di C e ti studi un po' le strighe (ovvero gli array
di caratteri terminati da uno 0) ?
Se non sai rispondere ad una domanda come questa non vedo
come puoi programmare alcunche'.
</QUOTE>
Tommy

Avete presente quando uno non tocca una cosa per anni
e ci si rimette sopra spizzicando pagine del K&R
andando avanti e indietro senza molto criterio,
e scopiazza codice a destra e a manca? eccone il risultato...
Volevo fare in fretta, e invece non mi ricordavo cose fondamentali...
poi vabbè, molti controlli, come quello per non sforare i 50 caratteri
di str, non li ho messi, perchè pernso di usare un'allocazione dinamica di
memoria.
Credo cmq che vi stresserò ancora, crecando però di aver già letto ciò che
mi serve.
Ora mi sembra di avere abbastanza su cui lavorare.
Molte grazie a tutti, anche per le strigliate (sempre ben accette in questi
casi...)
bye ;-)