PDA

View Full Version : [C] Realizzare una funzione trim(), cos'è che non và?


Free/Sbin
03-07-2006, 12:26
Come ersercizio ci hanno dato da realizzare una nostra versione della funzione trim(), una funzione che riceve una stringa ed elimina eventuali spazzi alla fine della stringa...cos'è che non và?
Mi dà i seguenti messaggi di errore:

[root@dhcppc0 ripasso]# cc trim.c -o trim
trim.c: In function ‘main’:
trim.c:16: error: incompatible types in assignment
trim.c: In function ‘trim’:
trim.c:32: error: invalid operands to binary *
trim.c:32: error: syntax error before ‘;’ token
[root@dhcppc0 ripasso]#





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

char * trim(char *); // Riceve il puntatore a una stringa, restituisce il puntatore alla stringa modificata

int main(){
char s[25] = "stringa ";
int count=0;

while(s[count] != '\0')
count++;

printf("La stringa s contiene la parola: %s ed è formata da %d caratteri\n\n", s, count);
printf("CHIAMO LA FUNZIONE trim() ED ELIMINO GLI SPAZI A DESTRA\n\n");

s = trim(s); // Metti in s il puntatore alla stringa modificata da trim();

printf("Ora la stringa s contiene la parola: %s ed è formata da %d caratteri\n\n", s, count);

return 0;
}

char * trim(char *stringa){ // Riceve il puntaore ad una stringa e restituisce il puntatore alla stringa mod

char *p; // Dichiara il puntatore all'ultimo carattere della stringa in input
/* Imposta p all'ultimo elemento prima del carattere di fine stringa di stringa */
p = stringa + strlen(stringa) -1;

/* Finchè il valore puntato da p è uno spazio e l'indirizzo contenuto in p non coincide con l'inizio
stringa */
while((*p == ' ') && (p != stringa)
*(p+1) = '\0'; // Metti nella locazione puntata da p+1 il carattere di fine stringa

return(stringa);
}

trallallero
03-07-2006, 12:39
Come ersercizio ci hanno dato da realizzare una nostra versione della funzione trim(), una funzione che riceve una stringa ed elimina eventuali spazzi alla fine della stringa...cos'è che non và?
Mi dà i seguenti messaggi di errore:

[root@dhcppc0 ripasso]# cc trim.c -o trim
trim.c: In function ‘main’:
trim.c:16: error: incompatible types in assignment
trim.c: In function ‘trim’:
trim.c:32: error: invalid operands to binary *
trim.c:32: error: syntax error before ‘;’ token
[root@dhcppc0 ripasso]#





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

char * trim(char *); // Riceve il puntatore a una stringa, restituisce il puntatore alla stringa modificata

int main(){
char s[25] = "stringa ";
int count=0;

while(s[count] != '\0')
count++;

printf("La stringa s contiene la parola: %s ed è formata da %d caratteri\n\n", s, count);
printf("CHIAMO LA FUNZIONE trim() ED ELIMINO GLI SPAZI A DESTRA\n\n");

s = trim(s); // Metti in s il puntatore alla stringa modificata da trim();

printf("Ora la stringa s contiene la parola: %s ed è formata da %d caratteri\n\n", s, count);

return 0;
}

char * trim(char *stringa){ // Riceve il puntaore ad una stringa e restituisce il puntatore alla stringa mod

char *p; // Dichiara il puntatore all'ultimo carattere della stringa in input
/* Imposta p all'ultimo elemento prima del carattere di fine stringa di stringa */
p = stringa + strlen(stringa) -1;

/* Finchè il valore puntato da p è uno spazio e l'indirizzo contenuto in p non coincide con l'inizio
stringa */
while((*p == ' ') && (p != stringa)
*(p+1) = '\0'; // Metti nella locazione puntata da p+1 il carattere di fine stringa

return(stringa);
}

s l'hai dichiarata come array non come puntatore
quindi con l'istruzione

s = trim(s); // Metti in s il puntatore alla stringa modificata da trim();

stai cercando di modificare l'indirizzo di s che é fisso.

cosí é giusto:

strcpy( s, trim(s) );

anche se (per me) non serve tutto 'sto giro.


while((*p == ' ') && (p != stringa))

ti manca una parentesi.

e ocio ... hai un ciclo infinito ;)

Andlea
03-07-2006, 15:49
void trim(char *string){
while(string[strlen(string)-1]==' ')
string[strlen(string)-1]='\0';
}

Uso:

....
trim(stringa); // viene rimosso lo spazio
...

trallallero
03-07-2006, 16:10
void trim(char *string){
while(string[strlen(string)-1]==' ')
string[strlen(string)-1]='\0';
}
non per fare il precisino ma se gli passi una stringa di 128 char
con una sola "A" viene chiamata la funzione strlen() 127*2 volte ;)
non mi sembra molto performante :D

Andlea
03-07-2006, 17:04
heheheh verissimo, la solita fretta


void trim(char *string){
int i;
for(i=strlen(string)-1; i >= 0; i--){
if(string[i] != ' '){
string[i+1]='\0';
break;
}
}
}

Free/Sbin
03-07-2006, 17:41
s l'hai dichiarata come array non come puntatore
quindi con l'istruzione

s = trim(s); // Metti in s il puntatore alla stringa modificata da trim();

stai cercando di modificare l'indirizzo di s che é fisso.

cosí é giusto:

strcpy( s, trim(s) );

anche se (per me) non serve tutto 'sto giro.


while((*p == ' ') && (p != stringa))

ti manca una parentesi.

e ocio ... hai un ciclo infinito ;)

mm però così non funziona in quanto la mia funzione trim() deve restituire l'indirizzo dell'array modificato....quindi come fare? se invece non gli faccio restituire nulla e semplicemente modifico la stringa di partenza dentro alla funzione?dite che va bene? però il fatto è che così perderei la stringa di partenza con gli spazzi....

Free/Sbin
03-07-2006, 17:44
perchè ho un ciclo infinito?in effetti mi sembra che si alluppi...oh mio dio queste sono le soluzioni della proff e fanno cagare

trallallero
04-07-2006, 09:06
perchè ho un ciclo infinito?in effetti mi sembra che si alluppi...oh mio dio queste sono le soluzioni della proff e fanno cagare

spiego con un esempio:

p = stringa + strlen(stringa) -1;

se stringa = "ciao "
strlen(stringa) -1 = 6
p = 'c' + 6

quindi p punta a "ciao " ^


il tuo codice

while((*p == ' ') && (p != stringa))
*(p+1) = '\0';

é infinito perché

(p == ' ')

é vera

(p != stringa)

é vera

*(p+1) = '\0';

azzeri il valore p+1 ma non modifichi l'indirizzo di p
quindi le condizioni del ciclo non cambiano. Mai.

io la farei cosí:

void TrimStr(char *str)
{
short i;

i = strlen(str);
while ( i-- && (*(str+i) == ' ' || *(str+i) == '\0' || *(str+i) == '\n') )
;
*(str+i+1) = '\0';
}

scorre all'indietro ls stringa s fino a quando trova spazi, '\n' e \0
poi tappa str
se vuoi un ritorno aggiungi

return str;

e modifichi il tipo di ritorno della funzione.
Ciao