PDA

Visualizza la versione completa : [C] porting e gestione carattere \0


MyBloodyV.
02-10-2017, 13:12
sto facendo un porting di un software in C da HPUX a Linux (premetto che di C conosco poco)

un codice del genere (semplice esempietto da me creato)

char string1[4];
string1[0]='s';
string1[1]='d';
string1[2]='d';
string1[3] = '\0';

char string2[1];
string2[0] = 'a';
printf("\n%s\n", string2);

char string3[2];
string3[0] = 'a';
string3[1] = '\0';
printf("\n%s\n", string3);

sotto LINUX genera

asdd
a

mentre sotto HPUX

a
a

come se sotto Linux, la mancanza del carattere '\0' in string2 "sporcasse" la stessa stringa con il contenuto di string1, cosa che non accade sotto HPUX; quando invece si chiude con '\0' come nel caso di string3, il comportamento uguale

che mi consigliate?
visto che ho trovato nel codice degli array non chiusi con \0

Grazie

shodan
02-10-2017, 13:21
Ogni string in C dev'essere chiusa con il '\0' ( NULL ). Se questo viene omesso, il comportamento del compilatore indefinito. Ossia pu dare il problema che riscontri fino al crash dell'applicazione.
Se nel codice hai trovato array non chiusi con '\0', probabilmente sono proprio array e non stringhe intese come tali.

zacca94
02-10-2017, 13:21
che mi consigliate?
Dipende come lavori la stringa, ma bene utilizzare il null byte finale

MyBloodyV.
02-10-2017, 13:24
intanto grazie

cerco di capire come sono quegli array

MyBloodyV.
02-10-2017, 18:50
chiedo un'altra cosa: sui 2 sistemi operativi i tipi di dati differiscono per alcuni aspetti

non potrebbe causare problema questa cosa?
intendo per l'aggiunta (magari anche da parte di alcune funzioni) del '\0'

grazie e scusate se ho scritto boiate

shodan
02-10-2017, 20:11
A cosa ti riferisci di preciso?

MyBloodyV.
02-10-2017, 20:42
ipotizzo un esempio: su un sistema un intero ha una certa grandezza e su un altro, una diversa

ipotizzo eh, la prima volta che lavoro con Linux e C, avr quindi scritto tante boiate

shodan
02-10-2017, 21:33
Con sizeof(tipo di dato) ottieni la dimensione in bit del dato che ti interessa.
Qui puoi trovare una tabella con la dimensione tipica dei dati in HPUX:
http://www.teamnaconsulting.com/compresources/pdfs/92434-90009.pdf
Una precisazione comunque: In Linux 64bit il tipo long di 8sbytes (64bit) per default e lo stesso tutti i puntatori, mentre in Linux 32bit i long e i puntatori sono a 4bytes (32bit).
Controlla se nel sorgente HPUX sono definiti i tipi che trovi qui (almeno i primi quattro):
http://en.cppreference.com/w/c/types/integer
definiti in <stdint.h>. Se sono definiti allora non hai problemi riguardo la dimensione del dato, visto che un int32_t avr sempre 32bit come dimensione a prescindere dalla piattaforma; se non sono definiti sufficiente crearsi un piccolo header file all'uopo da includere dove serve.
A ogni modo non dovresti avere grossi problemi nel porting se il programma scritto con un compilatore recente (2010 in poi) su HPUX

MyBloodyV.
02-10-2017, 21:36
grazie

MyBloodyV.
03-10-2017, 11:18
come controllo con sicurezza se l'array termina con '\0'?
trovo varie versioni

grazie

Loading