Il 10/6/2017 13:54:09 Giuseppe Della Bianca scrisse:
>guido84 wrote:
>]zac[
>> A questo punto, per evitare un'immissione che provocherebbe
>> un sigfault, ho trovato due modi, potreste dirmi qual e' il
>]zac[
>Questi problemi li hanno avuti tutti quelli che hanno cominciato a
>programmare in C .
>Dovresti leggerti qualche documentazione/libro magari per principianti.
Si', ma son convinto che la lettura e' almeno 200x100 volte piu'
efficace quando /per pratica gia' fatta/ so-seguo-capisco di cosa
stanno parlando.
Insomma, e' come aprire una polemica sull'insegnamento: secondo
me i prof dovrebbero spiegare dopo aver prima assegnato un
capitolo da studiare sul libro a casa e per conto proprio.
>Come spunto, ' strncpy ' e ' snprintf '.
>Presta attenzione, che come molte cose nel C, sono funzioni poco amichevoli
>e introducono un effetto collaterale, che puo' trasformare in scrittura
>fuori dalla memoria (probabile) a una lettura fuori dalla memoria (piu'
>probabile).
>Come spunto, attenzione al ' \0 ' terminatore della stringa che potrebbe
>essere omesso.
Proprio la strncpy l'avevo gia' fatta, ed e' appunto per essa che
qui ho chiesto per quale scegliere tra le condizionali, perche'
ho visto che tanto ci sara' da applicarle in continuazione.
Il terminatore \0 assicurano che strncpy lo mette lei /sempre/,
forse dici quando invece d'usare strncpy mi faccio io un ciclo
for per copiare una [parte di] stringa?
Ecco lo strncpy, ero stato attento in particolare a malloc().
Ho spezzato il codice nei casi 2 e 3, ma sembra inutile e penso
proprio perche' evidentemente ci mette lo \0.
------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// char *strcpy(char *dest, char *orig, size_t n)
int main(int argc, char** argv)
{
int lunghezza, n;
if (argc==1)
{
printf("Usage: Duplica i primi n caratteri di $1 \n");
}
else // else_1
{
lunghezza = strlen(argv[1]);
printf("Scegliere n = 0..%d: ", lunghezza);
scanf("%d", &n);
// 1. n negativo
if (n < 0)
{
fprintf(stderr, "Error: n dev'essere positivo o nullo -- esco! \n");
exit(1);
}
// 2. Sicurezza (inutile?): n > lunghezza_origine
if (n > lunghezza)
{
printf("Soltanto %d caratteri disponibili, eccoli tutti: \n", lunghezza);
char* vett_enne;
vett_enne = malloc(lunghezza+1);
strncpy(vett_enne, argv[1], lunghezza);
printf("%s\n", vett_enne);
}
// 3. Caso ordinario.
else
{
char* vett_enne;
vett_enne = malloc(n+1);
strncpy(vett_enne, argv[1], n);
printf("%s\n", vett_enne);
}
} // fine else_1
return 0;
}
----------------------------
>Senza offesa, ribadisco che affrontare il C a tentativi e senza documentarsi
>prima e' poco sensato.
Ma no grazie ma figurati se non mi documentero' fino anche all'
eccessiva pignoleria. Solo che, senza vedere il codice fatto e
compilato da me, non mi riesce di seguire nessun manuale.
--
Saluti,
Guido