Newsgroup: it.comp.lang.c
Titolo: Ricavare un vettore di parole da una stringa

Ciao a tutti, ammetto di seguire il C da poco e di non essermi forse 
documentato a sufficienza per fare quello che vorrei, ma spero che 
vorrete lo stesso darmi una mano :-)
Sto tentando di scrivere un listato che mi permetta di ricavare un 
vettore di parole -memorizzabile in ELENCO- da una stringa raccolta con 
getchar in FRASE. In Python si puo' ricorrere a split, in C ho notato 
questo fantastica funzione strtok, ma purtroppo i miei tentativi di 
utilizzare librerie, array e matrici non sono andati a buon fine.
Vi giro il mio listato -che produce un misero: Segmentation fault- 
sperando che qualcuno possa aiutarmi a metterci una pezza. Grazie in 
anticipo! /marco
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
main()
{
   char c, frase[80], parola[80], elenco[10][80];
   int i=0, a=0;
   puts("Inserire una frase:");
   while ((c=getchar()) != '\n')
     frase[i++]=tolower(c);
   frase[i]='\0';
   strcpy(parola, strtok(frase, " "));
   while (parola != NULL)
   {
     strcpy(elenco[a++], parola);
     strcpy(parola, strtok(NULL, " "));
   }
   for (i=0; i<=a; i++)
     printf("%s\n", elenco[i]);
   return 0;
}

 }
In ogni caso io non userei strtok, che ï¿œ dichiaratamente obsoleta.
E.

 E.
Grazie!
Marco

 In ogni caso io non userei strtok, che � dichiaratamente obsoleta.
... e al suo posto, cosa useresti?
Ciao

 ... e al suo posto, cosa useresti?
Io quando uso una funzione, di solito ne leggo la documentazione. Se lo 
faceste anche voi sapreste con quale funzione va rimpiazzata strtok. Il 
modo piï¿œ veloce di ottenere la documentazione di una funzione libc, ï¿œ 
cercare le pagine "man". Con google "man strtok" in questo caso ï¿œ la 
chiave del sapere.
E.

 variabili normali per fare 'sto lavoro.
Cosa intendi con "*vettore" e con "variabile normale"? Dal codice che 
hai scritto sembra che non hai molta dimestichezza con i puntatori. 
Probabilmente ti conviene studiarti le caratteristiche di base del 
linguaggio C, prima di proseguire.
E.

?manu* ha scritto:

Nella man page non c'ï¿œ scritto granchï¿œ sull'obsolescenza della 
strtok()... forse il cygwin che ho sotto mano ha le manpage censurate :-)
Comunque se ti preme far presente che certe funzioni non andrebbero 
usate dovresti alzare il dito ogni volta che leggi printf(), scanf(), 
strcpy(), ... praticamente tutte le funzioni della libreria standard che 
manipolano stringhe.
Per chi fosse interessato:
https://www.securecoding.cert.org/confluence/display/seccode/MSC34-C.+Do+not+use+deprecated+and+obsolete+functions
https://www.securecoding.cert.org/confluence/display/seccode/STR07-C.+Use+TR+24731+for+remediation+of+existing+string+manipulation+code
Giovanni

Jive74 ha scritto:

Grazie, Giovanni. Il mio problema era nato proprio dal fatto che 
provando a modificare l'esempio fornito dalla guida di strtok per 
raggiungere i miei scopi avevo fatto un mezzo casino ^__^
/* Esempio con un carattere separatore */
#include <stdio.h>
#include <string.h>
int main()
{
  char s[] = "aaa bbb ccc ddd eee";
  char* p;
  printf("Stringa completa: \n %s\nStringa spezzata:\n",s);
  p = strtok(s, " ");
  while (p != NULL)
  {
    printf("%s\n", p);
    p = strtok(NULL, " ");
  }
  return 0;
}
Questo e' l'originale, io ovviamente ho provato a sostituire a char* p 
una matrice char elenco[10][80] per incamerare l'elenco delle parole 
contenute nella frase e li' sono iniziati i problemi, che ho provato a 
risolvere chiedendo aiuto al gruppo. Poi e' iniziata la discussione su 
strtok (che ho usato solo perche' mi pareva simile a SPLIT di Python) e 
ci siamo un po' persi :-D comunque ho scritto subito che non sono un 
esperto di C e cercavo solo un modo per risolvere il mio problema.
Ciao!
Marco