Perché la maggior parte della definizione della sottostringa della lingua consente la sottostringa ("abc", 3)=""

2

Ho visto la maggior parte delle lingue nel caso in cui il loro metodo di sottostringa utilizzi la lunghezza di una determinata stringa nel metodo poiché l'indice iniziale fornirà una stringa vuota. È decisamente utile quando si scrivono algoritmi che coinvolgono il successivo accorciamento della stringa fino a una stringa vuota. Il problema che ho è che rende la maggior parte dei riepiloghi di questi metodi / funzioni appaiono imprecisi quando descrivono il risultato.

Ad esempio, la sottostringa di Java per String afferma che "La sottostringa inizia al beginIndex specificato e si estende al carattere all'indice endIndex - 1.". Questo ha senso per tutti i valori 0 < = i < len (string). Non appena usi len (string), comunque, a cosa si riferisce quell'indice? In un linguaggio come C che usa le stringhe C, diventa naturalmente il terminatore nullo che trattiamo come una stringa vuota. Le implementazioni che ho visto in particolare controllano il range degli indici come [0, len (stringa)]. Quando viene specificato un solo argomento, prenderemo la differenza tra l'indice di inizio e la lunghezza della stringa che si risolve in 0 per startIndex = len (stringa).

Sono arrivato a credere che questa sia solo una convenzione inespressa tra le lingue che risalgono alle radici delle stringhe terminate da NULL per agire come stringhe vuote. Qualcuno può gettare un po 'di luce oltre è semplicemente così com'è?

    
posta edaniels 10.11.2015 - 00:15
fonte

3 risposte

12

Stai pensando al significato di questo argomento sbagliato.

Un po 'sorprendentemente, il valore non conta i caratteri . Ciò che conta sono le posizioni tra i caratteri nella stringa .

La stringa "abc" ha quattro posizioni di questo tipo: prima di a, tra aeb, tra be c, e dopo il c. Come al solito nel calcolo, contiamo queste posizioni da 0 a 3. Specificando due di queste posizioni, è immediatamente chiaro quali caratteri dovrebbero e non dovrebbero appartenere alla sottostringa: substr ("abc", 0, 1) significa ovviamente "a" e substr ("abc", 2,3) significa "c". E substr ("abc", 3) può significare solo "Inizia dalla posizione dopo la c", che ovviamente darà la stringa vuota.

Tutte le funzioni di sottostringa che abbia mai visto funzionano in questo modo, anche se l'unico posto che ho visto per me è l'aiuto in linea di emacs: quello è un vero colpo d'occhio. (Emacs è "focalizzato con intensità maniacale sul problema apparentemente semplice di modifica del testo" - Neal Stephenson)

    
risposta data 10.11.2015 - 00:31
fonte
1

sottostringa ("abc", 0) ti dà tre caratteri.

sottostringa ("abc", 1) ti dà due caratteri, uno in meno.

sottostringa ("abc", 2) ti dà di nuovo un carattere, uno in meno.

A questo punto ti aspetti una sottostringa ("abc", 3) per ridarti un carattere in meno, che sarebbe zero caratteri. È possibile restituire zero caratteri (risultato=""), ecco cosa restituisce.

sottostringa ("abc", 4) dovrebbe restituire un carattere in meno, che sarebbe -1 caratteri. Chiaramente, questo non è possibile, quindi non c'è alcun risultato ragionevole che questo possa tornare a te. Di conseguenza, fallisce.

    
risposta data 10.11.2015 - 11:37
fonte
0

La tua funzione di sottostringa sarebbe un sovraccarico di una funzione che prende l'inizio e la fine. Lì passeresti l'inizio e l'ultima passata.

Ciò significa che l'intera stringa sarà 0, length ; significa anche che una stringa vuota avrebbe entrambi i valori uguali.

Il fatto che l'indice sia compreso tra 0 e length include anche la possibilità di chiamarli su stringhe vuote (per quello che vale).

    
risposta data 10.11.2015 - 00:39
fonte

Leggi altre domande sui tag