Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Funzione strlen()

6 views
Skip to first unread message

guido84

unread,
Jun 4, 2017, 4:15:35 AM6/4/17
to
Adesso mi faccio tutte le funzioni, e' il modo piu' comodo e veloce
per capirci qualcosina del C.

====================== unsigned int strlen(char *srt) ===============
#include <stdio.h>
#include <string.h>
#define elle 81

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

if (argc==2)
{
sscanf(argv[1], "%s", a);
printf("\n%u\n\n", strlen(a));
}

if (argc==1)
{
printf("\nUsage: Conta i caratteri (max 80) immessi in argv[1] \n\n");
}

if (argc>=3)
{
printf("\nErrore: immettere solo in argv[1] \n\n");
}

return 0;
}

//$: gcc -Wall -O3 str-len.c -o str-len
===========================================


Il mio problema e' questo:
- Quando ho immesso piu' di 80 caratteri, ho provocato segfault.
- Ma come faccio a dirgli di uscire se son piu' di 80, quando e'
lei stessa (strlen) che deve contarli?!


Grazie in anticipo a chi en passant mi da' una dritta

--
Saluti,
Guido

Giovanni

unread,
Jun 4, 2017, 5:39:17 AM6/4/17
to
Fai il controllo del numero di caratteri prima della sscanf() !!!
Per esempio:

if (strlen(argv[1]) <= (elle -1)
{
sscanf(argv[1], "%s", a);
.......
}

Ciao
Giovanni
--
A computer is like an air conditioner,
it stops working when you open Windows.
< http://giovanni.homelinux.net/ >

Giovanni

unread,
Jun 4, 2017, 5:44:05 AM6/4/17
to
On 06/04/2017 10:15 AM, guido84 wrote:
Fai il controllo del numero di caratteri prima della sscanf() !!!
Per esempio:

if (strlen(argv[1]) <= (elle -1)
{
sscanf(argv[1], "%s", a);

Giuseppe Della Bianca

unread,
Jun 4, 2017, 6:20:42 AM6/4/17
to
guido84 wrote:

]zac[
> char a[elle];
>
> if (argc==2)
> {
> sscanf(argv[1], "%s", a);
> printf("\n%u\n\n", strlen(a));
]zac[
> Il mio problema e' questo:
> - Quando ho immesso piu' di 80 caratteri, ho provocato segfault.
> - Ma come faccio a dirgli di uscire se son piu' di 80, quando e'
> lei stessa (strlen) che deve contarli?!
]zac[

Il buffer overflow e' causato dalla funzione sscanf che scrive nella
variabile fino ad andare oltre la dimensione della stessa.
Il codice scritto dopo non puo' prevenire un problema che e' gia' avvenuto.

E' compito del programmatore scrivere il codice impedendo alle varie
funzioni di comportarsi scorrettamente.

P.S.
Non credi che dovresti provare a cercare su google sscanf + segfault o
sscanf + buffer overflow?

(Il miglior modo di imparare e' sfruttare le risorse e le esperienze
liberamente disponibili cercando di capire quale e' quella giusta).

guido84

unread,
Jun 4, 2017, 10:13:36 AM6/4/17
to
Il 4/6/2017 11:41:20 Giovanni scrisse:
>On 06/04/2017 10:15 AM, guido84 wrote:

>> Il mio problema e' questo:
>> - Quando ho immesso piu' di 80 caratteri, ho provocato segfault.
>> - Ma come faccio a dirgli di uscire se son piu' di 80, quando e'
>> lei stessa (strlen) che deve contarli?!

>Fai il controllo del numero di caratteri prima della sscanf() !!!
>Per esempio:
> if (strlen(argv[1]) <= (elle -1)
> {
> sscanf(argv[1], "%s", a);
> .......
> }

Gia', adesso mi sembra ovvio :-(

Ora va perfettamente! con la tua sintassi e i suggerimenti di
Giuseppe D.B. m'avete fatto capire l'inutilita' di caricare il
vettore a[] (che tra l'altro era lui che mi creava problemi).
Eccolo semplicissimo e grazie a entrambi!!

=================== unsigned int strlen(char *str) =============
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
unsigned int lunghezza;

if (argc==1) // argc == 1 -> NON si puo' contare una lunghezza infinita
{
printf("\nUsage: Conta i caratteri immessi in $1 \n\n");
}
else // argc > 1 -> adesso si puo' contare
{
lunghezza = strlen(argv[1]);
printf("%u\n", lunghezza);
}

return 0;
}

//$: gcc -Wall -O3 str-len.cc -o str-len
=======================================

--
Saluti,
Guido

0 new messages