Visit

23 August 2011

my test for lesson16, C language, Italy comment

my solution

main.c
/* programma test reverse string */
/* non funziona con la localizzasione Italiana, è viene scritto con ??,
* la soluzione la so, ma i soliti sapientoni dei forum\blog di programmazione,
* fanno solo polemiche, nhe'
*
*/
/* Esercizio 16, creare applicativo in terminale
* scrivere le seguenti funzioni:
* da una stringa, passare la stringa alla rovescio, usare malloc e free
* scrivere una stringa da terminale e dare numero caratteri
* togliere il carattere \n dalla stringa
* leggere il path corrente
* leggere i file della directory corrente, non in ordine
* avere come minimo due file *.h e relativi *.c, avere un file main.c, avere un makefile
* dal makefile avere la possibilità di generare un file *.tar.gz e cancellare i file *.o e l'eseguibile
*/

#include
#include
#include
#include
#include
#include
#include
#include
#include "scrivoleggo.h"
#include "reverse.h"

int main (int, char **);

int main (int argc, char **argv)
{
int x = 0;
char a_uno[] = "int main (int argc, char **argv)";

char line[MAX_LINEA];
char miapath[PATH_MAX + 1];

printf ("%s\n", a_uno);
rovescio (a_uno, strlen (a_uno));
printf ("%s\n", a_uno);

strcpy (miapath, leggopath ());
printf ("il mio path %s\n", miapath);
rovescio (miapath, strlen (miapath));
printf ("in reverse: %s\n\n", miapath);

/* per fermare l'immissione dare ctrl C o ctrl D in Linux\freeBSD */
while (getlinea (line, sizeof line) > 1)
{
discardnewline (line);
rovescio (line, strlen (line));
printf("%s\n", line);
}

printf ("\n");
x = leggodirectori ((leggopath ()), 0);

return (0);
}

--------------------------------------------------------------------
reverse.c
/* prova reverse string, funzioni varie */

#include
#include
#include
#include
#include "reverse.h"

char *rovescio (char *s, const int lung)
{
int l = lung,
x = 0;
char *p_dummy; /* puntatore a caratteri per rovesciare la stringa */

/* verifico se vi è abbastanza memoria da allocare */
if(!(p_dummy = malloc (l * sizeof (*p_dummy))))
{
fprintf (stderr,"memoria non allocata"); /* stampo un mess. in stderr su video */
exit (EXIT_FAILURE); /* Esco se ho memoria insufficiente. */
}

--l; /* diminuisco il valore per l'indice, in C partono da zero */
for (x = 0; x < lung; x++) { p_dummy[l] = s[x]; --l; } p_dummy[lung] = '\0'; /* aggiungo la fine stringa */ strcpy (s, p_dummy); /* copio la stringa invertita */ free (p_dummy); /* libero memoria allocata */ return (s); } void discardnewline (char *s) { int i; for(i = 0; s[i] != '\0'; i++) { if(s[i] == '\n') s[i] = '\0'; } } reverse.h /* reverse. prova string, header */ #ifndef REVERSE_H #define REVERSE_H #define MAX_LINEA 1024 /* * rovescio, per invertire una stringa o frase * * input: stringa da invertire, lunghezza stringa da invertire * output: stringa invertita * */ char *rovescio (char *, const int ); /* * cancello il punto a capo (newline '\n') * * input: stringa controllo * output: stringa senza newline * */ void discardnewline (char *); #endif -------------------------------------------------------------------- scrivoleggo.c /* prova wrote read string, funzioni varie */ #include
#include
#include
#include
#include
#include
#include
#include
#include "scrivoleggo.h"

int getlinea (char *s, const int lim)
{
int c, i;

for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) { s[i] = c; } if(c == '\n') { s[i++] = c; } s[i] = '\0'; return i; } int leggodirectori (char *s, int a) { int x = a; DIR *dir; struct dirent *drent; if((dir = opendir(s)) == NULL) { fprintf(stderr, "Errore opendir()\n"); return EXIT_FAILURE; } while((drent = readdir(dir)) != NULL) { fprintf(stdout, "--> %s\n", drent->d_name);
++x;
}

if(closedir(dir) < 0) { fprintf(stderr, "Errore closedir()\n"); return EXIT_FAILURE; } return (x); } char *leggopath (void) { char *miopath; char miobuff[PATH_MAX + 1]; miopath = getcwd( miobuff, PATH_MAX + 1 ); if( miopath != NULL ) { printf( "My working directory is --<%s>-- done\n", miopath );
}

return (miopath);
}

--------------------------------------------------------------------
scrivoleggo.h
/* input wrote read prova string, header */

#ifndef SCRIVOLEGGO_H
#define SCRIVOLEGGO_H

/*
* scrivo la linea con tastiera
*
* input: stringa da scrivere, massima lunghezza linea
* output: numeri caratteri scritti (da K&C book "language C", the bible for me)
*
*/
int getlinea (char *, const int );

/*
* scansiono directory
*
* input: stringa precorso directory da scansionare, valore numero file
* output: numero file scansionati
*
*/
int leggodirectori (char *, int );

char *leggopath (void);

#endif

--------------------------------------------------------------------
makefile
# -
# makefile by Erika
# se si ha bisogno della libreria matematica con math.h
# togliere il # davanti a -lm nella linea CFLAGS.
# ricordarsi di cambiare i nomi *.h e *.o, se no contattarmi per avere
# un applicazione(GPL) che leggendo una directory, mette i nomi *.h e *.c
# ricava i nomi *.o dai file *.c (*.cpp) e chiede il compilatore (gcc g++ o altro)
# chiede il nome eseguibile e altro ...
# -
# non la metto tale applicazione(GPL) perchè funziona solo in Linux\freeBSD,
# e dopo tante polemiche con i sapientoni dei vari forum/blog di programmazione
# che si ARRANGINO "loro" i sotutto, nhe', a scuola i proff. hanno detto che va bene ...
# -

CC=gcc
CFLAGS=-Wall -g -pedantic #-lm
DEPS = reverse.h scrivoleggo.h
SOURCES := main1.c reverse.c scrivoleggo.c
OBJ = main1.o reverse.o scrivoleggo.o
RM= rm -f
ARCHIVIO := tar -cf
COMPRESSO := gzip
PROGRAMMA := Rovescio

%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)

rovescio: $(OBJ)
gcc -o $@ $^ $(CFLAGS)

.PHONY: clean cleanall tarzippare
clean:
$(RM) -f $(OBJ)

cleanall: clean
$(RM) -f rovescio

# creo un file .gz, con i sorgenti
tarzippare: clean cleanall
$(RM) $(PROGRAMMA).tar.gz
$(ARCHIVIO) $(PROGRAMMA).tar $(SOURCES) $(DEPS) makefile
$(COMPRESSO) $(PROGRAMMA).tar


Erika

No comments:

Post a Comment