Newsgroup: it.comp.lang.c
Titolo: Neofita, vorrei capire qualcosa sulle stringhe

Ciao ragazzi, mi sto un po' "ingrippando" con le stringhe vi passo 
subito al problema. So che il c non avendo un tipo predefinito per le 
stringhe (a differenza del pascal) si può rimediare in vari modi, quindi
creando un vettore di caratteri oppure creando un puntatore che mi 
"punta alla stringa" immaganizzata in qualche parte nella memoria 
(passatemela per buona :P)... passiamo ai fatti...
char stringa[20]; //creo un array di char indicizzato da 0 a 19
scanf("%s", stringa);
Allora in questo caso se gli passo "Ciao Mondo" in stringa mi salva solo 
"Ciao", perchè l'input termine se trova uno spazio, oppure un carattere 
di newline o l'Eof, giusto?
In questo caso se voglio salvare la stringa intera dovrei utilizzare un
gets(stringa);
Mi chiedevo, non esiste un metodo (tralasciando iterazioni) per poter 
salvare mediante lettura con scanf l'intera stringa?
Potrà sembrare scema come domanda... ma purtroppo veramente di c non 
ricordo quasi più nulla! :D
-- 
______________________________
  Omega
 
http://gnammo.altervista.org
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

 poter salvare mediante lettura con scanf l'intera stringa?
#include <stdio.h>
int main()
{
        char stringa[20];
        if(scanf("%19[^\n]", stringa) != 1)
                fprintf(stderr, "maledetto\n");
        else
                puts(stringa);
        return 0;
}
cc
-- 
Prego scusa per il mio italiano errato. Tanti saluti dalla germania.

di newline o l'Eof, giusto?
E' il comportamento di scanf(). Dimenticatela ed usa fgets().

Grazie ragazzi :D
allora mi vado a leggere fgets che fa e come si "usa" :)
@Archeo... (mizzica che nick :P):
Ah però! Dovrei scrivere un header personalizzato solo per la funzione 
:P. Grazie :)


 interessi scomporre in sottostringhe.
In effetti, si :P
Però ti ringrazio lo stesso perchè almeno adesso conosco un metodo, se 
pur "contorto" che prima non conoscevo.


                 fprintf(stderr, "maledetto\n");
...
Se ho capito bene, leggo fino a 20 caratteri (indice da 0 a 19) escluso 
il newline?
E' corretto l'utilizzo che faccio di fgets?
...
    char stringa[20];
    fgets(stringa,20,stdin);
    puts(stringa);
...
Se ad esempio la stringa è "Ciao Mondo" = 10 char fgets mi tronca 
l'ultimo carattere perchè appunto il paramentro Size della funzione è 
SIZE-1 ovvero:
...
   char stringa[10];
   fgets(stringa,10,stdin);
   puts(stringa); //Output: Ciao Mond
...
posso quindi immettere come parametro size 11 (nel caso di "Ciao 
Mondo"), è corretto fare fgets(stringa,11,stdin) se la var stringa l'ho 
dichiarata di 10 char?
scusate se ve lo chiedo, perchè sto provando per intuizione (oltre che 
per lettura :P) e mi piace condividere i pareri in modo tale da poter 
imparare il linguaggio nei migliori dei modi


 allora mi vado a leggere fgets che fa e come si "usa" :)
Perche? Checosa non ti piace da scanf("%19[^\n]", stringa);?
cc

allora mi vado a leggere fgets che fa e come si "usa" :)
L'utilizzo di fgets() č piuttosto semplice: il primo parametro č il
buffer, il secondo la dimensione, il terzo č lo stream da cui si vuol
leggere (il che quindi non ti limita al solo stdin).

 scusate se ve lo chiedo, [...]
Nono, sono io che deve chiedere scusa. Scusate il italiano che
pretendo da voi. Poi, questa volta era veramente molto dificile per
me. Leggio questo gruppo per imparare la lingua italiana.
Come sempre: tanti saluti dalla germania.
cc

 Leggi 19 carattei (indice da 0 a 18).
Leggi fino 19 caratteri. possono essere anche meno.
cc

legge solo fino l'ultimo carattere primo il '\n' (come gets).
Sě, ma il new-line rimane comunque nel buffer, quindi per la lettura
successiva bisogna saltarlo.

 Perche? Checosa non ti piace da scanf("%19[^\n]", stringa);?
Scanf mi piace e soprattutto con conoscevo questo metodo di "formattare 
l'input" :) cioè io ero fermo al classico gets(stringa) o al massimo
scanf("%s", stringa) :P per questo ho voluto documentarmi anche su l'uso 
di fgets ;)
Hai ragione "Ciao Mondo\0" sono 11 caratteri, però escludendo 
(togliendo) il carattere di terminazione '\0' la stringa "Ciao Mondo" è 
di 10 caratteri, utilizzando fgets(stringa,10,stdin) ho come risultato 
in output "Ciao Mond" capito? :) Per questo mi chiedevo se ho richiamato 
bene la funzione o meno :D


 leggere (il che quindi non ti limita al solo stdin).
sono d'accordo con chi usa fgets
ma non in tutti gli ambienti va bene
Link : 
http://www.gnu.org/software/libc/manual/html_node/Line-Input.html
— Function: char * fgets (char *s, int count, FILE *stream)
     The fgets function reads characters from the stream stream up to 
and including a newline character and stores them in the string s, 
adding a null character to mark the end of the string. You must supply 
count characters worth of space in s, but the number of characters read 
is at most count - 1. The extra character space is used to hold the null 
character at the end of the string.
     If the system is already at end of file when you call fgets, then 
the contents of the array s are unchanged and a null pointer is 
returned. A null pointer is also returned if a read error occurs. 
Otherwise, the return value is the pointer s.
     Warning: If the input data has a null character, you can't tell. So 
don't use fgets unless you know the data cannot contain a null. Don't 
use it to read files edited by the user because, if the user inserts a 
null character, you should either handle it properly or print a clear 
error message. We recommend using getline instead of fgets.

don't use fgets unless you know the data cannot contain a null.
Mi sembra ovvio che se c'č un null nell'input venga gestito secondo le
convenzioni sulle stringhe... che mi sto perdendo?


non ti stai perdendo nulla, facevo notare che usando fgets si/ci possono 
avere delle sorprese.