RSS
 

Posts Tagged ‘strcat’

union ansi c

17 Jul

però siccome non si tratta di uCosì come per strcat ho avuto difficoltà a atrovare in giro per la rete qualche cosa di utile che mi spiegasse cosa facesse in concreto una union. Ecco il mio codice di esempio;

#include <stdio.h>
#include <stdlib.h>

typedef union _c
{
char byte[4];
int prova;
} c;
int main (void)
{
c prova;
prova.prova = 127;
printf(“%d”, prova.byte[0]);
return 0;
}

Come dovreste sapere (se siete interessati al C ovvio) un char occupa un byte mentre un int ne occupa 4. Se avessi usato una struttura, la struttura avrebbe occupato 4 + 1 = 5 byte in memoria. Con la union vengono occupati max(1,4) = 4 byte in memoria, ovvero il numero di byte pari alla dimensione occupata dalla variabile più grande.

La parte interessante, che si vede in questo esempio, è che se io scrivo la variabile intera della union, e poi vado a leggere “byte” nella prima posizione, allora troverò il valore 127. Ho fatto diversi esperimenti e per esempio ho inserito 128. Il valore stampato a video ovviamente è -128:

128 = 10000000 e l’1 davanti alla sequenza di bit indica che si tratta di un numero negativo.

Ho provato a modificare il codice impostando la union così:

typedef union _c
{
char byte[4];
unsigned int prova;
} c;

Mi aspettavo che quel 128, una volta stampato risultasse ancora positivo ed invece rimaneva negativo. Quindi ho provato con:

typedef union _c
{
unsigned char byte[4];
int prova;
} c;

… e questa volta il programma ha stampato 128. Ad essere sincero non credevo che i char potessero essere unsigned =). Un “carattere senza segno”. “a” e “-a” sono due cose ben diverse =). Del resto a volte 127 + 1 = -128. Sperto che questo post risolva i problemi di qualche sventurato che continua a non capire come mai le cose non vanno mai come devono andare.

Condividi questo post sui tuoi social network preferiti:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • MySpace
  • Twitter
  • Wikio IT
  • Live
  • RSS
  • StumbleUpon
  • Technorati
 
View Comments

Posted in tutto

 

Passare parametri in C e concatenare stringhe

20 Apr

Il listato in C che segue non ha una vera utilità, se non quella di prendere domestichezza con la malloc e con funzioni per concatenare le stringhe come strcat, strcpy e malloc.

E’ ridotto al minimo per essere il più corto possibile ma se un programma è corto non significa che sia anche migliore. Bisogna sempre tenere conto che prima di tutto, secondo me, il codice deve essere sempre più leggibile che altro. Creare un codice migliore ma meno leggibile ci costerà meno nell’immediato, ma nelle successive modifiche dovremo perdere tempo per comprendere ciò che si era scritto in passato.

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

int main (int argc, char * argv[])
{
char * NuovaSuperStringa;

/* Alloco tanta memoria quanta ne serve per contenere le due stringhe */
NuovaSuperStringa = malloc(sizeof(char) * (strlen(argv[argc - 2]) + strlen(argv[argc - 1]) + 1));
strcpy(NuovaSuperStringa, argv[argc - 1]);
strcat(NuovaSuperStringa, ” “);
strcat(NuovaSuperStringa, argv[argc - 2]);

printf(“%s\n”, NuovaSuperStringa);
return 0;
}

Per richiamare questo programma (programma.c), io l’ho fatto da shell, si compila con gcc:

gcc programma.c

A questo punto sarà stato creato a.out. Digitando, sempre da shell, i comandi

./a.out primastringa secondastringa

otterremo in output “secondastringa primastringa”.

Per quanto sia semplice questo codice, per chi non è abituato ad usare la shell, o anche semplicemente C, è un programma complicato =). Me ne vergogno un pochino eheh. Spero che sia utile a qualcuno come lo sarebbe stato per me nel momento del bisogno.

Condividi questo post sui tuoi social network preferiti:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • MySpace
  • Twitter
  • Wikio IT
  • Live
  • RSS
  • StumbleUpon
  • Technorati
 
View Comments

Posted in tutto