Newsgroup: it.comp.lang.c
Titolo: Prima occorrenza del carattere di spazio

Salve a tutti. Ho la necessita' di controllare la prima occorrenza del
carattere SPACE (che non so a quale '/' sia associato). Il formato della
stringa e' piu' o meno il seguente (ce ne sono circa 4000):
aof           "Art of Fighting"
aof2         "Art of Fighting 2"
kof2000   "King of ......
e via dicendo. Vorrei creare una funzione che prendesse come parametro la
stringa soprastante e ne isolasse solo la prima sottostringa ("aof" in
questo caso). Sto tentando di sviluppare una funzioncina ma ho qualche
problemino. Grazie anticipatamente per l'aiuto.
HellHound - uccidi CERBERO per l'indirizzo

 carattere SPACE (che non so a quale '/' sia associato).
Beh, isspace() esiste apposta (spazi, tab, newline, etc.) per sapere se 
un qualcosa e` uno spazio.
Una possibilita` e` quella di scandire la stringa di partenza e di 
modificarla, sostituendo il primo spazio con un '\0'. Puoi farlo con una 
funzione ad hoc:
----------------------------------------------------------------------
void
truncate_at_first_word(char * str)
{
     while(*str && ! isspace(*str)) ++str;
     *str = '\0';
}
Oppure, piu` semplicemente, con strtok()
----------------------------------------------------------------------
strtok(str," \t\n\r");
printf("Prima parola: %s\n",str);
Se invece non devi modificare la stringa di partenza, puoi usare 
sscanf(), ma devi avere un buffer abbastanza grande (esistono varianti 
non-ANSI di sscanf() che supportano anche l'allocazione automatica della 
memoria che serve, ma sono appunto non-ANSI).
----------------------------------------------------------------------
char buffer[1024];
sscanf(str,"%1023s",buffer);
Un'altra possibilita` e` quella di scandire la stringa fino al primo 
spazio, allocare lo spazio che serve e ritornare una copia della prima 
parola (che andra` deallocata con free()).
----------------------------------------------------------------------
/* Per calloc() */
#include <stdlib.h>
/* Per strncpy() */
#include <string.h>
/* Per isspace() */
#include <ctype.h>
char *
first_word_of(const char * str)
{
     const char * c;
     char * result;
     /* Procedi fino al primo spazio o fino a fine stringa */
     for(c = str; *c && ! isspace(*c); c++);
     /* Alloca tanti byte quanti ne servono, piu` uno per
      * il terminatore.
      */
     result = calloc(c - str + 1,sizeof(char));
     if(result) {
          /* Se l'allocazione ha successo, copia
           * il pezzo di stringa e terminala
           */
          strncpy(result,str,c - str);
          result[c - str] = '\0';
     }
     return result;
}
-- 
   |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
   |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
  _|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

 la stringa soprastante e ne isolasse solo la prima sottostringa ("aof"
[...]
Potresti usare la strchr che ti ritorna un puntatore alla prima
occorrenza del carattere cercato, dopo puoi tranquillamente giocare con
l'aritmetica dei puntatori e strndup per copiare solo quello che ti serve. 
Ciao,
Marco
-- 
//\/\ Marco (LM) Lamberto (lm AT sunnyspot DOT org)
      The Sunny Spot  -  
http://the.sunnyspot.org/
      SIForge.org     -  
http://www.siforge.org/

 carattere SPACE (che non so a quale '/' sia associato).
solo per precisare che lo spazio in ascii sarebbe \040 (backslash+valore
ascii in ottale)
ciao,
costa

 ascii in ottale)
E cos'hai contro la normale notazione ' '?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 che non so a quale '/' sia associato
(presumo intendesse '\' come '\n' per esempio)
comunque secondo me scrivere \040 fa piu' figo, e scrivere 0x20 ancora
di piu' :P
ciao,
costa

 di piu'
De gustibus. :-)
Peraltro ti posso dire che per la mia piccola esperienza personale, 
quando sono gli altri a usare questa filosofia e tu finisci a manutenere 
il loro codice, cambi idea piuttosto in fretta. :-)


 di piu' :P
Sono del parere opposto: ' ' e' e sara' SEMPRE uno spazio. Mettere il
carattere ASCII dello spazio non e' invece altrettanto portabile.
In pratica quando si puo', molto meglio evitare di mettere codici ascii. In
questo caso ' ' fa molto piu' figo (o programmatore esperto) rispetto a \040
e cavolate varie!
Tommy

di piu' :P
   Scrivere '@' - 0x20 fa ancora piu` figo, e ancora meno portabile
nello stesso tempo. :)
"\103\151\141\157"
-- 
S.L.

 di piu' :P
Solo che poi qualcuno deve mantenere il tuo programma e ti becchi
una compilation di "vaffa" da far impallidire uno scaricatore di
porto.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 porto.
vero... ;)
ma sai io non ho problemi: mi sono fatto tatuare la tabella ASCII sul
braccio sinistro ;)
ciao,
costa

S.L. <no.a...@by.email> wrote:

stupendo!!
ciao,
costa

 braccio sinistro ;)
E se non usa la codifica ASCII? Il tuo sistema smette di funzionare come ti 
aspetti :)
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

che non so a quale '/' sia associato
non per difendere uno stile di programmazione da IOCCC...
risposta meno seria:
dispongo di diverse braccia di riserva... hanno il bloccaggio rapido
come le forcelle delle mtb, le stacco/attacco in un attimo...
ciao,
costa