n° 219
Novembre 2017
Dicembre 13, 2017, 07:20:47 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: str_trim  (Letto 5506 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
bertolottipf
Full Member
***

Karma: +4/-7
Scollegato Scollegato

Messaggi: 443


Mostra profilo E-mail
« inserita:: Novembre 24, 2012, 11:48:47 »

Codice:
char *str_trim(char *stringa) {

char stringa2[100];
int nChar = 0;
int i = 0;
printf("\tlog:stringa lunga %d caratteri\n", strlen(stringa));
for (i = 0; i < strlen(stringa); i++) {
if (stringa[i] != ' ') {
stringa2[nChar] = stringa[i];
nChar++;
}
}

printf("\tlog:%s\n", stringa2);

stringa = stringa2;

printf("\tlog:%s\n", stringa);

return(stringa);
}

Questa  è la mia funzione... sballata!
Nel senso che se scrivo " De Benedetti" La stringa che mi ritorna è "DE"!
Potete aiutarmi???
TNX
Registrato
seb
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 15


Mostra profilo
« Risposta #1 inserita:: Novembre 25, 2012, 11:57:20 »

Ho provato la funzione con Visual C 6: passando la stringa " De Benedetti" mi ritorna "DeBenedetti" seguito però da una serie di caratteri non inizializzati.
Suggerisco pertanto di inserire
stringa2[nChar] = '\0';
alla fine del ciclo in modo da terminare la stringa.
Suggerisco anche di inserire dei controlli per evitare che 'nChar' raggiunga la dimensione massima di 100 caratteri; in alternativa si potrebbe effettuare il trim direttamente sulla stringa di partenza, senza appoggiarsi a 'stringa2', in modo da non avere alcuna limitazione di dimensione.
Infine, è errato assegnare stringa2 a stringa (viene copiato il puntatore): stringa2 è presente sullo stack e pertanto dopo l'uscita dalla funzione potrebbe contenere qualsiasi valore. Sarebbe preferibile effettuare una strcpy().
Registrato
bertolottipf
Full Member
***

Karma: +4/-7
Scollegato Scollegato

Messaggi: 443


Mostra profilo E-mail
« Risposta #2 inserita:: Novembre 26, 2012, 07:33:26 »

GRAZIE!!!
Quindi... Tu come riscriveresti la funzione?
TNX ANCORA.
Registrato
VBeXtreme
Sr. Member
****

Karma: +18/-106
Scollegato Scollegato

Messaggi: 700


Mostra profilo
« Risposta #3 inserita:: Novembre 26, 2012, 09:55:10 »

Se non ho capito male vuoi togliere tutti gli spazi? prima,durante,dopo?

Allora non hai bisogno di creare nessun genere d stringa suppementare,basta quella di origine che sicuramente sarà piu grande della sua elaborazione.
otterrai quindi:

Codice:
void str_trim(char *stringa)
{
int i,nchar;
int ls=strlen(stringa);

for (i = 0,nchar=0; i < ls; i++)
{
if (stringa[i] != ' ')
{
stringa[nchar++] = stringa[i];
}
}
stringa[nchar]='\0';
}

anche se a me piace piu cosi:
Codice:
void str_trim(char *str)
{
    char* dstr;

    for(dstr=str;*str!='\0';str++)
        if (*str!=' ') *dstr++=*str;

    *dstr='\0';
}

piu codice scrivo in c e piu questo linguaggio mi piace...scusate...
Registrato

//Sorry limit 300 char
#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}
bertolottipf
Full Member
***

Karma: +4/-7
Scollegato Scollegato

Messaggi: 443


Mostra profilo E-mail
« Risposta #4 inserita:: Novembre 27, 2012, 07:55:57 »

Grazie... purtroppo il mio compilatore GCC di Cygwin mi compila bene, ma al runtime la tua funzione, con un printf mi da solo le lettere precedenti il primo spazio...
TNX UGUALMENTE!
Registrato
VBeXtreme
Sr. Member
****

Karma: +18/-106
Scollegato Scollegato

Messaggi: 700


Mostra profilo
« Risposta #5 inserita:: Novembre 27, 2012, 08:44:08 »

sicuramente non la usi correttamente....(posta il codice)
Codice:
int main()
{
    char s[]="   ciao   mondo     ";
    printf("normal:=!%s!\n",s);

    str_trim(s);
    printf("  trim:=!%s!\n",s);

    return 0;
}
uso anche io GCC ma in versione windows mingw.
Registrato

//Sorry limit 300 char
#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}
bertolottipf
Full Member
***

Karma: +4/-7
Scollegato Scollegato

Messaggi: 443


Mostra profilo E-mail
« Risposta #6 inserita:: Novembre 27, 2012, 09:46:09 »

Codice:
#include <stdio.h>
#include "str_trim.h"


char codfis[16];

char cognome[100];
void getCognome(void);
void getCodFisCognome(void);

char nome[100];
void getNome(void);
void getCodFisNome(void);


int main(int argc, char* argv[]) {
getCognome();
getCodFisCognome();
printf("codice fiscale = %s", codfis);
return 0;
}

/**
 * Prende il cognome
 */
void getCognome() {
int rifai;
do {
rifai = 0;
printf("Cognome/i: ");
scanf("%s", &cognome);
//printf("\tlog: lunghezza cognome: %d\n", strlen(cognome));
if (strlen(cognome) == 1) {
rifai = 1; /// rifare
}
//printf("\tlog: point 1\n");
} while (rifai==1);
}

/**
 * Prende il nome
 */
void getNome() {
printf("Nome/i: ");
scanf("%s", &nome);
printf("\tlog:hai scritto %s\n", nome);
}

/**
 * Prende il codice fiscale parte cognome
 */
void getCodFisCognome() {
char *cognomeSenzaSpazi = cognome;
str_trim(cognomeSenzaSpazi);
int nChar = strlen(cognomeSenzaSpazi);
printf("\tlog: %s\n", cognomeSenzaSpazi);
printf("\tlog: nchar %d\n", nChar);
int letterePrese = 0;
int i;
int n = 0;

///prendo le consonanti
for (i = 0; i < nChar; i++) {
if (toupper(cognomeSenzaSpazi[i])!='A' &&
toupper(cognomeSenzaSpazi[i])!='E' &&
toupper(cognomeSenzaSpazi[i])!='I' &&
toupper(cognomeSenzaSpazi[i])!='O' &&
toupper(cognomeSenzaSpazi[i])!='U') {
letterePrese++;
//printf("\tlog: lettere prese = %d\n", letterePrese);
codfis[n] = toupper(cognomeSenzaSpazi[i]);
n++;
}///if
if (letterePrese == 3) {
break;
}///if
}///for

///prendo le vocali
if (letterePrese < 3) {
for (i = 0; i < nChar; i++) {
if (toupper(cognomeSenzaSpazi[i])=='A' ||
toupper(cognomeSenzaSpazi[i])=='E' ||
toupper(cognomeSenzaSpazi[i])=='I' ||
toupper(cognomeSenzaSpazi[i])=='O' ||
toupper(cognomeSenzaSpazi[i])=='U') {
letterePrese++;
//printf("\tlog: lettere prese = %d\n", letterePrese);
codfis[n] = toupper(cognomeSenzaSpazi[i]);
n++;
}///if
//printf("\tlog: i= %d", i);
if (letterePrese == 3) {
break;
}///if
}///for

if (letterePrese == 2) {
codfis[2] = 'X';
}///if
}
}

/**
 * Prende il codice fiscale parte nome
 */
void getCodFisNome() {

}
Registrato
VBeXtreme
Sr. Member
****

Karma: +18/-106
Scollegato Scollegato

Messaggi: 700


Mostra profilo
« Risposta #7 inserita:: Novembre 28, 2012, 02:56:37 »

Il problema risiede nella scanf che oltretutto è deprecata.
a parte che dovresti scrivere:
Codice:
scanf("s",cognome);
o al massimo
Codice:
scanf("s",&cognome[0]);

il problema vero e proprio però rimane nel fatto che scanf interpreta lo spazio come fine parametro:
Citazione
Scanf parametro %s
Accetta una stringa di caratteri non comprendente gli spazi. Alla fine e' aggiunto il terminatore '\0'. L'area di memoria puntata dal puntatore passato in argomento deve essere sufficientemente ampia da contenere i caratteri letti in input ed in piu' il terminatore. L'input del campo si arresta quando viene incontrato uno spazio, oppure quando e' stata raggiunta la lunghezza della stringa definita dall'ampiezza massima.

Registrato

//Sorry limit 300 char
#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}
bertolottipf
Full Member
***

Karma: +4/-7
Scollegato Scollegato

Messaggi: 443


Mostra profilo E-mail
« Risposta #8 inserita:: Novembre 28, 2012, 03:03:25 »

Ok... TNX... Scanf è deprecato ed è consigliato usare cosa???
Registrato
VBeXtreme
Sr. Member
****

Karma: +18/-106
Scollegato Scollegato

Messaggi: 700


Mostra profilo
« Risposta #9 inserita:: Novembre 28, 2012, 06:11:29 »

Ho scritto deprecata ma forse è meglio dire poco sicura...cmq di mia esperienza so che porta spesso ad errori.

puoi crearti una tua funzione,oppure ne cerchi una tramite il tuo motore di ricerca preferito.

Una ad esempio può risultare questa:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void str_trim(char *str)
{
char* dstr;

        for(dstr=str;*str!='\0';str++)
            if (*str!=' ') *dstr++=*str;

*dstr='\0';
}

char *getline(char* s,int sz)
{
    fgets(s, sz, stdin);
    s[strcspn(s,"\n")] = '\0';
    return s;
}

int main()
{
char nome[100];

printf("Insert nome:");

getline(nome,100);
        str_trim(nome);

        printf("Hai scritto:%s\n",nome);

    return 0;
}
Registrato

//Sorry limit 300 char
#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}
bertolottipf
Full Member
***

Karma: +4/-7
Scollegato Scollegato

Messaggi: 443


Mostra profilo E-mail
« Risposta #10 inserita:: Novembre 28, 2012, 06:30:33 »

il tuo programma però mi da

$ gcc test.c
test.c:16: error: conflicting types for 'getline'
/usr/include/sys/stdio.h:37: error: previous declaration of 'getline' was here
test.c:16: error: conflicting types for 'getline'
/usr/include/sys/stdio.h:37: error: previous declaration of 'getline' was here
Registrato
VBeXtreme
Sr. Member
****

Karma: +18/-106
Scollegato Scollegato

Messaggi: 700


Mostra profilo
« Risposta #11 inserita:: Novembre 29, 2012, 09:14:27 »

cavolo Linux ha gia la funzione getline.
Quindi o usi l'implementazione di linux sopra citata,altrimenti cambi nome alla funzione che ti ho postato.
Codice:
char *str_getline(char* s,int sz)
Registrato

//Sorry limit 300 char
#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines