Newsgroup: it.comp.lang.c
Titolo: strpos

Devo controllare la posizione di alcune stringhe in un messaggio FIPA ACL ma 
non riesco a capire perché strpos() non mi restituisce la posizione.
Questo è il sorgente, un grazie a chi mi svela l'arcano.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
  char m[80];
  int  ck1,ck2,pos1,pos2,pos3;
  printf("messaggio: ");
  scanf("%s",&m);
  m[strlen(m)-1] = 0;
  ck1=strpos(m,"request:sender");
  ck2=strpos(m,"inform:sender");
  pos1=strpos(m,":sender");
  pos2=strpos(m,":receiver");
  pos3=strpos(m,":content");
  printf("%d %d %d %d %d \n",ck1,ck2,pos1,pos2,pos3);
  system("PAUSE");
  return 0;
}
int strpos(char *str, char *search)
{
  int i,j,n,l;
  l = strlen(search);
  n = strlen(str)-l+1;
  for(i=0;i<n;i++)
  {
   for(j=0;j<l&&search[j]==str[i+j];j++);
     if(j==l) return i;
  }
  return -1;
} 


Che noia...
-- 
"Non puoi insegnare qualcosa ad un uomo.
  Lo puoi solo aiutare a scoprirla dentro di sé." (G. Galilei)
Vincenzo Mercuri

 }
Questa strpos() non fa proprio quello che m'aspetterei... se vuoi una
funzione tipo la strpos() del PHP, utilizza la funzione standard
strstr().
Ciao!

 non riesco a capire perché strpos() non mi restituisce la posizione.
Se il tuo scopo non è reinventare la ruota prima di scrivere funzioni 
che lavorano sulle stringhe verifica sempre cosa hai già a disposizione:
http://clc-wiki.net/wiki/C_standard_library:string.h
e in particolare
http://clc-wiki.net/wiki/strstr
-- 
r--r--r--

strstr().
Con strstr() neanche senza gli spazi funziona.
Ora... potrei sostituire tutti gli spazi con qualche carattere, tanto a me 
serve solo controllare se quelle stringhe ci sono e in che posizione.
Ma vorrei capire perché cavolo "schifia" gli spazi.
.. 

 ha scritto nel messaggio 
news:stnjo.240351$813.2...@tornado.fastwebnet.it...

Già provato...
.. 

 ha scritto nel messaggionews:8808e4ce-9ebc-438a...@q2g2000vbk.googlegroups.com...

Lo spazio è un carattere come qualsiasi altro... non dovrebbe?
Ciao!

 Con strstr() neanche senza gli spazi funziona.
Metterti a studiare no, eh?
#include <stdio.h>
#include <string.h>
void test(char* str) {
     printf("%s\n", str);
     char* ck2 = strstr(str, "inform:sender");
     char* pos1 = strstr(str, ":sender");
     char* pos2 = strstr(str, ":receiver");
     char* pos3 = strstr(str, ":content");
     printf("%d %d %d %d \n",
            ck2 - str,
            pos1 - str,
            pos2 - str,
            pos3 - str
           );
}
int main(void) {
     char stashed[] =
"inform:sendertizio:receivercaio:contentsticavoli";
     char separated[] =
"inform:sender tizio :receiver caio :content sticavoli";
     test(stashed);
     test(separated);
     return 0;
}
/*
inform:sendertizio:receivercaio:contentsticavoli
0 6 18 31
inform:sender tizio :receiver caio :content sticavoli
0 6 20 35
*/
-- 
  FSC - 
http://userscripts.org/scripts/show/59948
 
http://fscode.altervista.org
 - 
http://sardinias.com

 Già provato...
Non t'è venuto il dubbio che il problema non sia strstr ma sia altrove?
 >    scanf("%s",&m);
Dalla manpage di scanf (
http://www.manpagez.com/man/3/scanf/
):
s     Matches a sequence of non-white-space characters;
...e casualmente a te da "problemi" se c'è lo spazio! ;-)
-- 
r--r--r--


Grande! Questa a me era proprio sfuggita :-D
Ciao!

 ha scritto nel messaggio 
news:c1pjo.240456$813.1...@tornado.fastwebnet.it...

Grazie... ho risolto sostituendo  scanf("%s",&m) con fgets(m,80,stdin) che 
non si "mangia" i miei spazi.
Ora funziona perfettamente.
.. 

 Metterti a studiare no, eh?
Che noia...
Cmq grazie anche a te, ma nel mio caso è preferibile usare la "mia" strpos() 
così mi ritrovo direttamente i valori interi senza troppe conversioni e se 
la stringa non viene trovata un semplice -1.
Inoltre il codice è maggiormente leggibile che è un'altra delle 
caratteristiche che mi necessitano.
.. 

    scanf("%s",&m);
http://c-faq.com/stdio/scanf1a.html
http://c-faq.com/stdio/scanfhang.html
http://c-faq.com/stdio/scanfinterlace.html
http://c-faq.com/stdio/gets_flush2.html
http://www.dinkumware.com/manuals/default.aspx?manual=compleat&page=lib_scan.html#Scan
 
Functions
http://www.soe.ucsc.edu/classes/cmps012a/Fall98/faq/scanfQ.html


 Funziona cosě al giorno d'oggi? studiare č noioso... :P
Studiare non č noioso, studiare č piacevole almeno per me che mi sto per 
prendere la mia terza laurea.
Quelli che sono noiosi sono gli atteggiamenti di supponenza.
.. 

 che mi sto per prendere la mia terza laurea.
Con buona pace dei pleonasmi.

 Quelli che sono noiosi sono gli atteggiamenti di supponenza.
Già, perché dire che stai per prendere la terza laurea è un 
atteggiamento di modestia... peccato che non lo puoi dimostrare, dato 
che sei un utente anonimo: dobbiamo crederti sulla parola (la 
credibilità della tua parola è quantomeno notevole, non c'è che dire).
Tanto per la cronaca, comunque, ho conosciuto laureati ignoranti e 
ottusi. Se tanto mi da tanto devo allungare la lista.


 di modestia... peccato che non lo puoi dimostrare, dato
E perché mai lo dovrei dimostrare?
Mica sono venuto qua a fare a gara a chi è più dotato.
Io ho posto dei problemi e ho chiesto a chi li trovava intellettualmente 
interessanti se ne aveva piacere di fornire delle soluzioni.
.. 

 E perché mai lo dovrei dimostrare?
Perché è una affermazione straordinaria che /necessita/ di prove al fine 
di essere accettata. Tu hai usato tale affermazione a supporto del fatto 
che ti piace lo studio, quando al lato pratico i tuoi post dimostrano 
esattamente il contrario: dimostrano che preferisci chiedere agli altri 
di risolverti i problemi e di "farti i compiti".
L'attendibilità di una persona che posta messaggi in maniera anonima è 
contestabile in linea di principio, ma nel tuo caso hai già "consumato" 
da un pezzo il beneficio del dubbio.
Credo che a questo punto ti lascerò la soddisfazione dell'ultima parola: 
tutti i nostri messaggi sono archiviati, giusto nel caso qualche lettore 
desiderasse chiarirsi le idee sul tuo intervento in questo gruppo e 
sulla pesantezza delle mie accuse nei tuoi confronti.


 risolverti i problemi e di "farti i compiti".
Ma neanche per sogno, i problemi che ho posto io sono tutti di carattere 
generale.
Se non sbaglio il manifesto del gruppo dice:
Il newsgroup tratterà del linguaggio C, ideato da Brian W. Kernighan e 
Dennis
M. Ritchie.
Il newsgroup tratterà di qualsiasi dialetto del linguaggio C, in modo
particolare del vecchio K&R e di quello specificato dall'istituto americano
ANSI come standard "ANSI X3.159-1989" e ratificato dall'istituto
internazionale ISO come standard "ISO/IEC 9899:1990". Argomenti compresi:
- Il linguaggio in generale;
- Gli algoritmi;
- Le ottimizzazioni;
- La portabilità;
- I sistemi di sviluppo.
..