[RISOLTO][C]return di una stringa

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: [C]return di una stringa

Messaggio da Blizzard »

- KISS rule
eh gia! :D
> static char out[4096]
> out[0] = '\0';
è davvero necessario (a parte per qualche regola di buon coding) inserire out[0]='\0' ???
per quello che ne so le variabili static sono automaticamente inizializzate a 0 -> '\0' in char
e dato che dopo c'è una strcpy(out, a); pensavo che il codice fosse comunque sicuro...
ho preso n'altra cantonata??

Avatar utente
robbybby
Linux 4.x
Linux 4.x
Messaggi: 1223
Iscritto il: sab 16 dic 2006, 10:48
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5
Località: Fra Trantor e Terminus

Re: [C]return di una stringa

Messaggio da robbybby »

Blizzard ha scritto: è davvero necessario (a parte per qualche regola di buon coding) inserire out[0]='\0' ???
Inizializza, inizializza, inizializza, almeno eviti comportamenti random quando fai errori.

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: [C]return di una stringa

Messaggio da Blizzard »

si si!!! infatti avevo puntualizzato il (a parte per qualche regola di buon coding)
avrei fatto assolutamente la stessa cosa... ma mi era venuto comunque il dubbio che servisse forzatamente oltre che per scrivere codice robusto. :D (la paranoia) :D

thx

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [C]return di una stringa

Messaggio da Mario Vanoni »

boh ha scritto:
Mario Vanoni ha scritto: > out[0] = '\0';

@boh
aggiungi la riga sopra citata, scusa ul vecc
Ah ora ho capito!
La strcat sostituisce il terminatore con il primo carattere della stringa da concatenare, ma essendo che
non c'è ancora alcun terminatore all'interno di p, funziona appunto a random :D
La strcpy d'altro canto copia anche il terminatore, quindi è rigoroso prima una strcpy e poi una strcat, è questo giusto?
(grazie ancora a Mario!)
SI e NO

static char out[N + 1]; // definisce la stringa privata di boh()
out[0] = '\0'; // azzera out ad ogni chiamata di boh()
strcpy(out, a); // copia a in out con \0 di chiusura
strcat(out, b); // concantena b in out con \0 di chiusura

Tranne una, le funzioni di string.h terminano la stringa sempre con un \0
eccezione:
strcnpy(s1, s2, (size_t) n); // n non e` int, ma size_t
li` e` perentorio di aggiungere
s1[n] = '\0';
altrimenti ci sono guai in vista

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: [C]return di una stringa

Messaggio da Mario Vanoni »

Blizzard ha scritto:
- KISS rule
eh gia! :D
> static char out[4096]
> out[0] = '\0';
è davvero necessario (a parte per qualche regola di buon coding) inserire out[0]='\0' ???
per quello che ne so le variabili static sono automaticamente inizializzate a 0 -> '\0' in char
e dato che dopo c'è una strcpy(out, a); pensavo che il codice fosse comunque sicuro...
ho preso n'altra cantonata??
forse

per esperienza con una funzione che puo` essere rientrante
e` piu` prudente azzerare la variabile prima di usarla,
poi il programma deve essere portabile, oggi Linux, domani Solaris,
cosa fara` veramente il compilatore X in loco?

programmare in modo difensivo e mai dare per scontato

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: [C]return di una stringa

Messaggio da Blizzard »

cosa fara` veramente il compilatore X in loco?

programmare in modo difensivo e mai dare per scontato
aggiunta alle regole di vita! :P

Avatar utente
kreen
Linux 2.x
Linux 2.x
Messaggi: 228
Iscritto il: mer 1 feb 2006, 18:32
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE
Località: Verona

Re: [C]return di una stringa

Messaggio da kreen »

@boh

Ciao.
Ho visto che nello sviluppo del tuo programma, hai iniziato a manipolare dinamicamente la memoria, prima dell'orribile uso
di :D static :D
Lungi da me l'idea di poterti insegnare qualcosa, pero' un consiglio mi sento di dartelo:
quando utilizzi quel tipo di tecniche, entra in modalita' paranoia. E abituati subito a farlo.
Non pensare che "tanto il programma e' piccolo, non serve" [-X , perche' e' dall'inizio che si
costruisce un metodo.
Quindi controlla che la malloc abbia allocato.
Quando un puntatore non e' in uso, ovvero non punta a nulla di significativo, puo' darsi che
punti da qualche altra parte. Mettigli la sicura, riportandolo a NULL. Dopo che hai usato un'arma, di solito la si mette in sicurezza.
Se chiami free due volte sullo stesso puntatore, dovresti fare un bel casino (almeno, una volta era cosi').
Se non ti abitui subito, quando avrai codice mooolto piu' complesso perderai giorni a "debuggare" codice che ti sembra corretto, ma nasconde insidie.
Tutto questo IMHO, poi ognuno fa come vuole, ben inteso. :thumbright:

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Re: [C]return di una stringa

Messaggio da Dani »

kreen ha scritto: Se chiami free due volte sullo stesso puntatore, dovresti fare un bel casino (almeno, una volta era cosi').
Anche oggi è così :D almeno con le glibc della slackware (MALLOC_CHECK_ non viene esportata di default).

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: [C]return di una stringa

Messaggio da Blizzard »

ciao,
il tempo è tiranno ma la butto li comunque....

[OT]
se magari scriviamo qualche riga su come codare in modo robusto??? e poi si getta nel wiki (magari si chiede a nuitari se vuole aggiungerle nella sua sezione su ansi C)

si può fare qualcosa del tipo...
si apre un topic con un problema... e si tenta di trovare la soluzione ansi C più robusta per quel problema... oppure per le cose più semplici si scrive direttamente un esempio su un buon modo di codare (che ne so... per forkare un processo oppure per aprire un file)
per chi si avvicina al C penso che farebbe bene {anche se penso sempre che il migliore insegnante è una notte passata a debuggare uno stupidissimo errore di dimenticanza... penso che non ti ricapiterà più :badgrin: }
[/OT]

Gio

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Re: [C]return di una stringa

Messaggio da Dani »

Blizzard ha scritto: {anche se penso sempre che il migliore insegnante è una notte passata a debuggare uno stupidissimo errore di dimenticanza... penso che non ti ricapiterà più :badgrin: }
[/OT]
Per esperienza personale posso confermare x'D Immagine

Rispondi