Può questa funzione è più sicuro? Cerchi consigli ei vostri pensieri!
Domanda
questo è in qualche modo di una domanda strana.
ho scritto una funzione C. Il suo 'come' strchr / strrchr. Si suppone che cercare un carattere in una c-string, ma andando a ritroso, e tornare un puntatore ad esso. Come stringhe C non sono "null iniziati", ci vuole anche un terzo parametro 'count', che indica il numero di caratteri si deve guardare indietro.
/*
*s: Position from where to start looking for the desired character.
*c: Character to look for.
*count: Amount of tests to be done
*
* Returns NULL if c is not in (s-count,s)
* Returns a pointer to the occurrence of c in s.
*/
char* b_strchr(const char* s,int c,size_t count){
while (count-->0){
if (*s==c) return s;
s--;
}
return NULL;
}
Ho fatto alcuni testing su di esso, ma Vedete eventuali difetti in esso? Le questioni di sicurezza o giù di lì? Eventuali miglioramenti? Potrebbe essere migliorato? E più importante:? Si tratta di una cattiva idea
Alcuni utilizzo.
char* string = "1234567890";
printf("c: %c\n",*b_strchr(string+9,'5',10));//prints 5
printf("c: %c\n",*b_strchr(string+6,'1',7));//prints 1
EDIT: Nuova interfaccia, alcune modifiche
./*
* from: Pointer to character where to start going back.
* begin: Pointer to characther where search will end.
*
* Returns NULL if c is not between [begin,from]
* Otherwise, returns pointer to c.
*/
char* b_strchr(const char* begin,int c,const char* from){
while (begin<=from){
if (*from==c) return from;
from--;
}
return NULL;
}
Soluzione
E 'meglio con la modifica, ma l'interfaccia è ancora sorprendente. Avevo messo il begin
parametro (il pagliaio da ricercare) come primo parametro, il parametro di c
( ago ricercata) secondo, e il from
parametri (posizione di partenza della ricerca) terzo. Che fine sembra essere idiomatica in una abbastanza grande set di API.
Altri suggerimenti
Il codice ha un'interfaccia esoterica - passare un puntatore l'ultimo carattere della stringa e la lunghezza della stringa. Che porterà a problemi di utilizzarlo.
(In alternativa, il codice ha un bug - si dovrebbe aggiungere al conteggio s prima del ciclo).
Se inizio è da, il codice corrente tornerà sempre cominciare, che non è quello che si vuole. Il codice dopo il ciclo può essere solo NULL ritorno. E invece di cominciare! = Da nella condizione del ciclo, vorrei utilizzare iniziare Modifica: Il secondo pensiero dal momento che si desidera [iniziare, dal] inclusiva dovrebbe essere iniziare <= da
ho scritto una funzione C. Il suo 'come' strchr / strrchr.
Hai tentato di reinventare strrchr()
, quindi non è come strchr()
.
Non si vede eventuali difetti in esso?
Sì. Parecchi. : - (
Dal b_strchr()
può tornare NULL
, non si deve metterlo direttamente nel printf()
dichiarazione. Deferencing s
solito si traduce in un segfault.
Si può essere meglio con la vostra variante preferita di ...
char *result;
result = b_strchr(string + 9, 'a', 10));
if (result == NULL)
{
printf("c: NULL\n");
}
else
{
printf("c: %c\n", *result);
}
Inoltre, quando
(count >= length of the input string) and the character is not found
si sta andando ad ottenere risultati unpredicable perché <=> è più che punta a un carattere della stringa - <=> sta puntando alla memoria prima dell'inizio della stringa. A titolo di esempio, provare
result = b_strchr(string + 9, 'a', 11));
if (result == NULL)
{
printf("c: NULL\n");
}
else
{
printf("c: %c\n", *result);
}
e vedere cosa succede.
Espandi i tuoi casi di test utilizzare per includere le condizioni al di fuori di ciò che si sa sarà lavorare con successo. Chiedere a qualcun altro per aiutarvi a progettare casi di test in grado davvero di provare il codice.
E più importante: Si tratta di una cattiva idea
?
Come un esercizio di apprendimento, assolutamente no.
Tuttavia, in questo caso, per il codice di produzione si sarebbe meglio attenersi allo standard <=>.