2009-02-01 9 views
24

Ho usato strpbrk() occasionalmente mentre eseguivo le stringhe di basso livello in C, ma non sono mai stato in grado di capire cosa rappresenta. L'ho sempre pronunciato internamente nella mia testa come "stir p bark", ma non è mai stato proprio così giusto.Cosa significa "strpbrk"?

Non ha un'etologia ovvia come nessuna delle altre funzioni stringa, ad es. strchr (str ing ch un r acter) o strspn (str ing sp un n).

Ricordo vagamente di aver letto da qualche parte che tutte le funzioni della libreria standard originale erano limitate a nomi di 7 caratteri o per rimanere compatibili con Fortran, o perché nello standard C originale, gli identificatori più lunghi di 7 caratteri erano considerati equivalenti ai loro 7 -carattere prefisso o qualcosa del genere. Qualcuno può confermare/negare/chiarire questo?

+0

in procinto di aumentare un Q simile, quindi ho trovato la risposta qui. La tua "stir p bark" sembra piuttosto creativa;) – artm

+1

L'ho sempre pronunciato come "strip [bork] (https://en.wikipedia.org/wiki/Swedish_Chef)". Ha più senso di qualsiasi altra spiegazione per me :) – Lundin

risposta

25

La seguente conversazione suggerisce "String Pointer Break": http://www.cpptalk.net/what-strspn-and-strpbrk-stands-for--vt1253.html

In effetti il ​​caso documentazione di Microsoft è strpbrk e tenderebbe a confermare che scissione di parole: http://msdn.microsoft.com/en-us/library/bb760010(VS.85).aspx

E infine questo lo conferma: http://www.gnu.org/software/libtool/manual/libc/Search-Functions.html

Lo strpbrk (“stringa puntatore rompere”) funzione è relativa alla strcspn, salvo che r crea un puntatore al primo carattere in stringa che è un membro del set stopset invece della lunghezza della sottostringa iniziale. Restituisce un puntatore nullo se non viene trovato alcun carattere di questo tipo da stopset.

+7

Ow - rompendo un puntatore suoni dolorosi – bobobobo

3

Mi ricordo che vageuly strpbrk sta per String Pointer Pausa, non mi ricordo dove l'ho visto.

12

From The GNU C Library documentation:

Funzione: char * strpbrk (const char * string, char * stopset)

Lo strpbrk ("stringa puntatore pausa") funzione è relativa alla strcspn , eccetto che restituisce un puntatore al primo carattere nella stringa che è un membro del set stopset invece della lunghezza della sottostringa iniziale. Il valore restituisce un puntatore nullo se non viene trovato alcun carattere di tipo da parte di stopset.

Per esempio,

strpbrk ("ciao, mondo", "\ t \ n,,.!?") => "world"

La funzione restituisce un puntatore a il primo carattere nello STOPSET (aka BREAKSET). Leggo mentalmente come "per STR ing, restituire P ointer a BR ea K".

7

Per quanto riguarda l'altra domanda:

Ricordo vagamente letto da qualche parte che tutti gli originali di serie funzioni di libreria sono stati limitati a nomi 7 caratteri o di rimanere compatibile con Fortran, o perché in lo standard C originale, gli identificatori più lunghi di 7 caratteri erano considerati equivalenti al loro prefisso di 7 caratteri o qualcosa del genere. Può qualcuno confermare/negare/chiarire questo?

L'originale ANSI C standard ha detto che era implementazione definito il numero di caratteri di un simbolo esterno sarebbe significativo, ma che doveva essere di almeno 6 caratteri (e l'implementazione è stata ammessa ad essere insensibile al caso per loro). Ciò è avvenuto perché molto tempo fa, i sistemi spesso avevano questo tipo di limitazione (sia che provenisse da librerie FORTRAN, limitazioni di linker o qualsiasi altra cosa).

Così mentre vedrete nomi esterni più lunghi di quelli nella libreria standard, nessuno di questi nomi inizia con la stessa sequenza di 6 caratteri.

FWIW, C99 ha superato il numero minimo di 31 caratteri. Lo standard C++ (1998) dice che l'implementazione deve documentare quanto di un nome esterno è significativo e suggerisce che sia almeno 1024 caratteri. So che Borland C++ 5.5 ha una limitazione di qualcosa come 250 caratteri che causa problemi in particolare con l'uso di modelli.

+3

Grazie per aver risposto all'altra metà della domanda, che personalmente ho trovato interessante. –

2

Nel 1972 presso Bell Labs esisteva anche un linguaggio di programmazione denominato Snobol che era destinato alla manipolazione delle stringhe. Aveva funzioni break() e span(), che essenzialmente facevano la stessa cosa. La maggior parte delle funzioni di stringa sono modellate su qualcosa che è apparso in Snobol. Controlla il curriculum vitae e i libri scritti dal Dott. James F. Gimpel

0

Mentre tutti citano cose che non spiegano perché è "STRING Pointer BReaK". Sarai in grado di ricordarlo facilmente e capire perché stroncati quando lo pensi in therms dell'algoritmo sottostante come questo:

Durante la scansione di STRINGA BREAK se si trova uno qualsiasi dei caratteri sul POINTER.