PDA

View Full Version : [C] Problema con stringhe


Manugal
11-12-2005, 11:13
Ciao :)

Devo scrivere un programma che prenda da un file di testo una serie di stringhe e mi stampi solamente quelle che terminano con "ed".

Il codice che ho scritto è il seguente, mi sembra giusto però non stampa niente. :cry:



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXCHAR 200

void numerostringhe2(char *s1, char *s2);

int main(void){

char *s1=(char *)malloc((MAXCHAR+1)*sizeof(char));
char *s2=" ";
int i=0;
char c;

while((c=getchar())!=EOF)
s1[i++]=c;

s1[i]='\0';

numerostringhe2(s1,s2);
return 0;
}

void numerostringhe2(char *s1, char *s2){

int i=1;
char *tmp;

tmp=strtok(s1,s2);
if(tmp[strlen(tmp)]=='d' && tmp[strlen(tmp)-1]=='e')
printf("%s", *tmp);
while((tmp=strtok(NULL,s2))!=NULL)
if(tmp[strlen(tmp)]=='d' && tmp[strlen(tmp)-1]=='e')
printf("%s", *tmp);
}



Chi mi può aiutare? Grazie.

Fenomeno85
11-12-2005, 12:28
domanda scema è ... ma il file ando sta? non mi sembra proprio che te lavori sui file. Poi ti sei innamorato di strtok?

~§~ Sempre E Solo Lei ~§~

Manugal
11-12-2005, 12:44
Il file lo do in input io tramite la redirezione. ;)

Uso strtok in modo da isolare le varie sottostringhe e controllarle separatamente. Altrimenti come posso fare?

Fenomeno85
11-12-2005, 12:52
allora tra che si potrebbe verificare un bufferoverflow come ridere ... a parte questo insignificante problema ... puoi anche usare un for.

~§~ Sempre E Solo Lei ~§~

Manugal
11-12-2005, 13:26
Scusa ma così non mi aiuti molto. Il for al posto di cosa? In qualunque caso uso strtok per prendere le sottostringhe

andbin
11-12-2005, 13:36
Ciao, ti riscrivo (corretto) il ciclo nella funzione numerostringhe2():

tmp = strtok (s1, s2);

while (tmp != NULL)
{
if (tmp[strlen(tmp)-2]=='e' && tmp[strlen(tmp)-1]=='d')
printf ("%s", tmp);

tmp = strtok (NULL, s2);
}

Manugal
11-12-2005, 20:33
Ok grazie proverò ;)

Manugal
12-12-2005, 13:50
Purtroppo ancora non stampa niente :(

Ho creato un file di testo con scritto just married (quindi dovrebbe stampare married), però quando faccio partire il programma con questo testo in input non stampa niente. :(

andbin
12-12-2005, 14:43
Purtroppo ancora non stampa niente :( Riposta il codice così come è nella tua ultima versione che verifichiamo.

Manugal
12-12-2005, 15:36
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXCHAR 200

void numerostringhe2(char *s1, char *s2);

int main(void){

char *s1=(char *)malloc((MAXCHAR+1)*sizeof(char));
char *s2=" ";
int i=0;
char c;

while((c=getchar())!=EOF)
s1[i++]=c;

s1[i]='\0';

numerostringhe2(s1,s2);
return 0;
}

void numerostringhe2(char *s1, char *s2){

char *tmp;

tmp=strtok(s1,s2);
while(tmp!=NULL){
if((tmp[strlen(tmp)-1]=='d') && (tmp[strlen(tmp)-2]=='e'))
printf("%s", *tmp);
tmp=strtok(NULL,s2);
}
}



Grazie sempre molto disponibili :)

DanieleC88
12-12-2005, 15:38
Ciao, ti riscrivo (corretto) il ciclo nella funzione numerostringhe2():

tmp = strtok (s1, s2);

while (tmp != NULL)
{
if (tmp[strlen(tmp)-2]=='e' && tmp[strlen(tmp)-1]=='d')
printf ("%s", tmp);

tmp = strtok (NULL, s2);
}
Bene, ma... non era molto piu' semplice questa?
if (strcmp((tmp + strlen(tmp) - 2), "ed") == 0) {
printf ("%s", tmp);
}
:D

(oppure quest'altra, che fa lo stesso lavoro:
if (strcmp(&tmp[strlen(tmp) - 2], "ed") == 0) {
printf ("%s", tmp);
}
)

andbin
12-12-2005, 15:52
L'errore è qui:
printf("%s", *tmp);non devi dereferenziare il puntatore (nel codice che avevo postato io non c'era infatti il *). Quindi:
printf("%s", tmp);

DanieleC88
12-12-2005, 15:56
L'errore è qui:
printf("%s", *tmp);non devi dereferenziare il puntatore (nel codice che avevo postato io non c'era infatti il *). Quindi:
printf("%s", tmp);
Non solo. Il programma non toglie il '\n' alla fine delle linee, quindi legge male il carattere finale. :D

DanieleC88
12-12-2005, 15:59
Infatti. Il codice funzionante:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXCHAR 200

void numerostringhe2(char *, char *);

int main(void)
{
char *s1 = (char *) malloc((MAXCHAR+1) * sizeof(char));
int i = 0;
char c = '\0';

while ((c = getchar()) != EOF) {
if (c != '\n') {
s1[i++] = c;
}
else {
s1[i++] = ' ';
}
}
s1[i] = '\0';

numerostringhe2(s1, " ");
return 0;
}

void numerostringhe2(char *s1, char *s2)
{
char *tmp;

tmp = strtok(s1, s2);
while (tmp) {
if (strcmp(&tmp[strlen(tmp) - 2], "ed") == 0) {
printf("%s\n", tmp);
}

tmp = strtok(NULL, s2);
}
}

Manugal
12-12-2005, 16:00
Grazie ora infatti funziona ;).

In effetti sarebbe stato più semplice come aveva detto DanieleC88, ma non mi sono proprio ricordato di strcmp :stordita:

andbin
12-12-2005, 16:01
Bene, ma... non era molto piu' semplice questa?
if (strcmp((tmp + strlen(tmp) - 2), "ed") == 0) {
printf ("%s", tmp);
}
:D

(oppure quest'altra, che fa lo stesso lavoro:
if (strcmp(&tmp[strlen(tmp) - 2], "ed") == 0) {
printf ("%s", tmp);
}
)Certamente!!! Ma Manugal aveva iniziato nel suo post mettendo il test sui singoli caratteri (non so perché ma probabilmente voleva fare così) ed io ho semplicemente mantenuto lo stesso concetto.

andbin
12-12-2005, 16:04
Infatti. Il codice funzionante:Basta semplicemente specificare alla strtok di usare come separatore anche il '\n' oltre allo spazio. Quindi:

numerostringhe2(s1, " \n");Senza fare test vari sui caratteri!

DanieleC88
12-12-2005, 16:13
Certamente!!! Ma Manugal aveva iniziato nel suo post mettendo il test sui singoli caratteri (non so perché ma probabilmente voleva fare così) ed io ho semplicemente mantenuto lo stesso concetto.
Ah, ok. :)
Basta semplicemente specificare alla strtok di usare come separatore anche il '\n' oltre allo spazio.
Argh! Non c'avevo pensato! :doh:

ciao ;)