Newsgroup: it.comp.lang.c++
Titolo: Esiste funzione per sottostringhe

Esiste una funzione in c++ che mi permetta ,dato un array di char, di
estrarre una sottostringa?

 di estrarre una sottostringa?
No, pero` puoi costruire una stringa a partire da una qualsiasi
sequanza di caratteri, quindi anche da un "sotto-array":
  const char array [10] = "abcdefghi";
  string str(array+1, array+5);  // "bcde"
       Mauro


ma anche:
const char array [10] = "abcdefghi";
char array2[10]; /* Per non fare errori in questo caso doveva essere almeno
6 caratteri, i 5 copiati più il terminatore */
strncpy(array2, array + 1, 5); /* +x indica di partire dall'x° carattere,
dove +0 è il primo, +1 il secondo... 5 sono i caratteri da copiare. Se hai
inizio e fine allora basta che fai fine - inizio + 1. */
array2[5] = '\0'; /* aggiungi il terminatore a mano, se la stringa che hai
copiato aveva 5 o meno caratteri allora stai piazzando un terminatore
inutile... Pazienza! Il c ignora tutti i caratteri dopo il primo terminatore
*/
(copi 5 caratteri, ci appendi tu a mano dopo i 5 caratteri copiati il
terminatore di stringa \0)

Attenzione perň... Se tu vuoi fare una comparazione di una sottostringa (in
basic faresti: if mid(stringa, 1, 3) = "cop") allora prova:
strncmp(str1 + offset, str2, numcaratteri)
dove offset č 0 se vuoi partire dall'inizio, 1 per partire dal 2ndo
carattere... e numcaratteri č il numero di caratteri su cui fare la
comparazione. Ovviamente str2 parte dall'inizio :-) Se vuoi anche lě ci puoi
sommare un offset, ma sarebbe inutile.
(e ti esce:
if (strncmp(str1 + offset, str2, numcaratteri) == 0) { }
se invece vuoi farlo case insensitive se f#####o... Lo standard ANSI non lo
prevede... Prova a guardare se c'č un _strnicmp o un strnicmp (nel Visual
C++ c'č il primo) :-)
Ti tocca prima convertire la stringa di partenza in lowercase (non so se
puoi farlo) e poi fare le comparazioni con altre stringhe lowercase.
(annotazione... Se vuoi fare delle comparazioni multiple, č sottointeso che
ti conviene fare per prima cosa tutte le conversioni possibili sulla
stringa, quali per esempio in lowercase, e poi fare solo comparazioni case
insensitive)
--- bye

 */
E il vantaggio di questo metodo quale sarebbe?
Ti stai allenando per un concorso di "obfuscated code"?
      Mauro

 Ti stai allenando per un concorso di "obfuscated code"?
Che talvolta non si ha il lusso di poter usare le string, e quindi sapere
come si fanno le cose (che poi magari le string stesse le fanno al loro
interno) è utile.
Che poi magari il mio metodo sia più da "vecchia scuola C" che da
"moderni-programmatori-C++-che-usano-solo-le-STL" è sicuramente vero. Però
funziona, è sicuramente il più veloce (o per lo meno ha pari velocità), ed
era inutile nel suo caso andare ad introdurre nuovi concetti quando lui
stava appena imparando ad usare quelli vecchi.
Benchè le string siano tanto tanto belle, lo stesso il mondo è fatto a
zero-terminated-string, e se tu non sai come funzionano sei fregato!
(inoltre soprattutto con il caso seguente in cui usavo la strncmp ci si
risparmia una copia della stringa in memoria, ed imparare queste piccole
ottimizzazioni rende un programmatore migliore).
A differenza degli interi, le stringhe, se possibile, non andrebbero mai
copiate. Ogni volta che ti copi in giro una stringa ti dovresti chiedere
"sto facendo una ca##ata?" "potrei farlo senza copiare la stringa?" e anche
"creando una copia della stringa, creo una possibilità di fault a causa di
mancanza della memoria, il gioco vale la candela?"
---