Stringhe ed Array in C

di il
2 risposte

Stringhe ed Array in C

Ciao a tutti!
Abbiamo cominciato oggi all'università il C...beh la lezione non mi è stata proprio chiara e ci sono state sparate molte informazioni in poco tempo. Ci è stato dato questo esercizio per riscaldamento.

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

#define LZ 5
#define my_strncpy(d,s) strncpy(d,s,sizeof(d)-1)
#define my_printc for ( j=0 ; j < sizeof(c) ; j++ ) \
			printf("%s(c[%d]==%d)", j ? " && " : "" , j, c[j] );

char zero[LZ];

char c[]={ '0', 0, 'o', 'a', 'i', 'e' };

char s_format[] = { "\nBra"
	"v%c!\n" };

int main(int argc, char ** argv){
	int i = 0, j, lc=strlen(c);
	FILE * ff = stdout;
        char * q = c, * p = NULL;

	if ( argc > 1 && strlen(argv[1]) ) {
		if ( *(argv[1]) == 'f' )
			i = 1;
	}

        printf("Questo eseguibile e` stato prodotto compilando il file sorgente %s.c",
		MY_SOURCE_FILE);
        fprintf(stdout,"\ned e` stato mandato in esecuzione da shell col comando:\n");
	fputs(argv[0],stdout);
	for (j=1;j<argc ; j++)
		printf(" %s",argv[j]);

	putchar('\n'); putc('\n',ff);

	printf("Nel file %s.c, \"char zero[LZ];\" definisce un array di %d caratteri, ",
		MY_SOURCE_FILE,LZ);
	printf("che\nviene successivamente inizializzato con \"my_strncpy(zero,c);\"");
        my_strncpy(zero,c);
	fprintf(stdout," per contenere una strin-\nga di lunghezza %d < %d.\n",
		(int)strlen(zero), (int)sizeof(zero));
	printf("Di conseguenza, dopo tale inizializzazione \"zero\" diventa la stringa: \"%s\"",
               zero);
	printf("\nSia \"*zero\" sia \"zero[0]\" indicano il primo elemento dell'array, ");
        fprintf(ff,"ossia la codifica\nASCII del carattere '%c' (rappresentato dal numero %d).\n",
		*zero, zero[0] );
	printf("Tutte le stringhe devono essere terminate col codice %d (che non rap"
		"presenta un\ncarattere stampabile), dopo l'ultimo carattere della stringa.\n",
		*(zero+strlen(zero)) );

	printf("\n\"char c[]={ '0', 0, ... };\" definisce un array di %d caratteri "
		"inizializzato staticamen-\nte", (int)sizeof(c) );
        printf(" il cui contenuto inizialmente e`:\n");
        my_printc
	printf("\nMa \"c\", oltre a rappresentare tale array di %d caratteri, e` anche una stringa"
		" di\nlunghezza %d che gode della proprieta`:\n", (int)sizeof(c),lc);
	printf("( strcmp(c,zero) == %d )\ne questo perche` contiene il valore %d in "
		"corrispondenza dell'indice %d ;-)\n\n", strcmp(c,zero), c[lc], lc );
	printf("Ovviamente il contenuto dell'array \"c\" puo` essere modificato in qualsiasi"
		" momento,\nper esempio eseguendo l'istruzione \"sprintf(c,\"%%c\",'p');\"");
	sprintf(c,"%c",'p');
	printf(" e ottenendo " "come risultato:\n");
        my_printc
        for ( j=2 ; j ; j-- )
		putc('\n',stdout);

	printf("\"char * q = c,\" definisce un puntatore a caratteri allocato automaticamente"
		" nello\nstack e allo stesso tempo lo inizializza in modo da farlo puntare"
		" al primo elemento\ndell'array \"c\".\n");
 	printf("Quindi sia \"*q\" che \"q[0]\" possono essere usati come alias di"
		" \"*c\" e/o di \"c[0]\" dopo\ntale definizione/inizializzazione.\n");
        printf("C'e` tuttavia una differenza importante tra \"c\" e \"q\": il primo e` solo "
		"il nome di\nuna variabile di tipo array, mentre il secondo e` solo il nome di"
		" un'altra variabile\ndi tipo puntatore!");
	printf("  Di conseguenza il puntatore \"q\" puo` essere cambiato dopo\nl'inizializzazione,"
		" per esempio eseguendo l'istruzione \"q += lc;\", mentre questa\nstessa"
		" istruzione non avrebbe senso se applicata a \"c\"!\n");
	q += lc;
	printf("Dopo questo incremento, il puntatore \"q\" passa a puntare all'elemento di indice"
		" %d\ndell'array \"c\" e quindi puo` essere usato come il nome di un array di %d "
		"caratteri\n(che coincidono con gli ultimi %d elementi di \"c\".\n",
		lc, (int)(sizeof(c)-lc), (int)(sizeof(c)-lc) );
	printf("Siccome ora il primo elemento dell'array \"q\" contiene il valore 0, \"q\" e`"
		" diventato\nanche la stringa vuota \"%s\" dopo questo incremento ...\n", q );
	printf("Incrementando ulteriormente il puntatore \"q\", per esempio valutando "
		"l'espressione\n\"*++q\", \"q\" passa a puntare al carattere successivo di \"c\""
		" che contiene il valore %d\n(diverso da 0).", *++q );
	printf("  A questo punto, \"q\" non e` piu` il nome di una stringa, perche`\nnessuno degli "
		"elementi dell'array \"q\" contiene il valore 0 atto a terminare una\nstringa.\n");
	printf("In effetti, ora abbiamo i seguenti caratteri nell'array \"q\":");

/*** TO BE COMPLETED START ***/

	
/*** TO BE COMPLETED END ***/

	exit(0);
}
Dentro i TO BE COMPLETED devo implementare il codice.

Leggendo il codice fornito ho capito di dover stampare Q...che sarebbe un array ,giusto?
Ho pensato di iterare l'array e stampare il tutto,ma il prof ci dice che con una riga si può fare tutto...quindi con una semplice printf dovrei risolvere il tutto?Grazie a tutti!

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte