Esercizi di lettura di codice C
Jump to navigation
Jump to search
Questi programmi non sono necessariamente stilisticamente belli (non sono "esempi da copiare") ma presentano dei passaggi di non semplice lettura.
Il consiglio e' di compilarli, provarli e capirne passo-passo il funzionamento. (o spiegare perche' non funzionino).
Ovviamente potete proporre ulteriori esempi.
programma 0
#include <stdio.h>
int main(int argc, char *argv[]) {
int c;
while ((c=getchar())!=EOF)
putchar(c);
return 0;
}
programma 1
#include <stdio.h>
char s1[]="hello world";
char *s2="hello world";
void foo(char *s) {
printf("%s\n",s);
s[4]=',';
printf("%s\n",s);
}
int main(int argc, char *argv[]) {
foo(s1);
foo(s2);
return 0;
}
programma 2
#include <stdio.h>
char t[]="test";
struct st {
char s[5];
char *t;
} st0={"test",t};
void foo (struct st i) {
i.s[2]='n';
i.t[2]='n';
}
void bar (struct st *i) {
i->s[2]='x';
i->t[2]='x';
}
int main(int argc, char *argv[]) {
printf("%s %s\n",st0.s,st0.t);
foo(st0);
printf("%s %s\n",st0.s,st0.t);
bar(&st0);
printf("%s %s\n",st0.s,st0.t);
return 0;
}
programma 3
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
while (argc > 1) {
int i,j;
char *s=argv[1];
for (i=0, j=strlen(s)-1; i < j; i++, j--)
s[i] ^= s[j], s[j] ^= s[i], s[i] ^= s[j];
printf("%s ",s);
argc--;
argv++;
}
printf("\n");
return 0;
}
programma 4
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct elem {
char *s;
struct elem *next;
};
struct elem *root=NULL;
void insert(char *s, struct elem **elp) {
if (*elp && strcmp((*elp)->s, s) < 0)
insert(s,&((*elp)->next));
else {
struct elem tmp={s,*elp};
struct elem *new=malloc(sizeof(struct elem));
*new=tmp;
*elp=new;
}
}
struct elem *print(struct elem *root) {
if (root) {
printf("%s ",root->s);
root->next=print(root->next);
free(root);
return NULL;
}
}
int main(int argc, char *argv[]) {
for (;argc>1;argc--,argv++)
insert(argv[1],&root);
root=print(root);
printf("\n");
return 0;
}