Repository 32bit  Forum
Repository 64bit  Wiki

[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.

Re: [C]return di una stringa

Messaggioda Blizzard » mar feb 26, 2008 22:41

- 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
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: [C]return di una stringa

Messaggioda robbybby » mar feb 26, 2008 22:57

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
robbybby
Linux 3.x
Linux 3.x
 
Messaggi: 1172
Iscritto il: sab dic 16, 2006 10:48
Località: Fra Trantor e Terminus
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5

Re: [C]return di una stringa

Messaggioda Blizzard » mar feb 26, 2008 23:02

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
Avatar utente
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: [C]return di una stringa

Messaggioda Mario Vanoni » mar feb 26, 2008 23:08

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 set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [C]return di una stringa

Messaggioda Mario Vanoni » mar feb 26, 2008 23:18

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
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [C]return di una stringa

Messaggioda Blizzard » mar feb 26, 2008 23:24

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
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: [C]return di una stringa

Messaggioda kreen » mer feb 27, 2008 0:14

@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:
Avatar utente
kreen
Linux 2.4
Linux 2.4
 
Messaggi: 228
Iscritto il: mer feb 01, 2006 18:32
Località: Verona
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE

Re: [C]return di una stringa

Messaggioda Dani » mer feb 27, 2008 0:17

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).
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch

Re: [C]return di una stringa

Messaggioda Blizzard » mer feb 27, 2008 9:58

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
Avatar utente
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: [C]return di una stringa

Messaggioda Dani » mer feb 27, 2008 11:28

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
Dani
Linux 3.x
Linux 3.x
 
Messaggi: 1447
Iscritto il: mer apr 26, 2006 0:52
Desktop: gnome
Distribuzione: arch

Precedente

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti