|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
[C] carattere di una stringa
ciao,
per determinare un certo tipo carattere in una matrice di stringhe uso la seguente chiamata: if( filename[i][strlen(filename[i])-4] ) == 'x') fai qualcosa è un errore? Ultima modifica di misterx : 26-07-2012 alle 05:40. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
lo so che la domanda era banale ma una svista mi faceva ottenere un risultato sbagliato che ora ho risolto
![]() Già che ci sono vi chiedo qual'è il modo più furbo per verificare se in una stringa esiste nella sua parte finale una sottostringa esempio stringa="xyz.aabbabcdefg.aabb"; sottostringa=".aabb"; devo verificare se la parte finale di stringa termina con sottostringa. Chiaramente nel mio esempio creato apposta, si nota che sottostringa potrebbe essere presente anche in una posizione qualsiasi di stringa, ma a me interessa verrificare che esista solo alla fine. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Idea di massima: parti dalla fine delle stringhe e torna verso l'inizio. Al primo carattere diverso, la prima stringa non contiene la seconda.
Implementazione a GRANDISSIME linee. Codice:
#include <stdlib.h> #include <stdio.h> #include <string.h> int strrevcmp(char * s1, char * s2) { for (int i = strlen(s1) - 1, j = strlen(s2) - 1; j && i; --j, --i) if (s1[i] != s2[j]) return 0; return 1; } int main (int argc, char ** argv) { char * s1 = argv[1]; char * s2 = argv[2]; if (strrevcmp(s1, s2)) printf("S1 contiene S2 in coda\n"); else printf("S1 NON contiene S2 in coda\n"); }
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
|
Quote:
Codice:
#include <string.h> int suffix_cmp(const char * s, const char * suffix) { const size_t s_len = strlen(s); const size_t suffix_len = strlen(suffix); if( s_len == 0 || suffix_len == 0 ) { return 0; } if( suffix_len <= s_len ) { return ! strcmp(s + s_len - suffix_len, suffix); } else { return 0; } } |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
bella idea, grazie 1000 |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
Usa strstr
![]() http://linux.die.net/man/3/strstr Fa una ricerca ottimizzata (usa l'algoritmo di Boyer-Moore) per trovare la sottostringa, e ti restituisce il puntatore all'inizio di essa. A quel punto basta confrontare se l'ha trovato alla fine ovvero: Se puntatore_fine_stringa - puntatore_tornato_da_strstr == lunghezza_stringa_da_cercare, allora vuol dire che l'hai trovato in fondo ![]() Nota: se non erro strstr si ferma alla prima sottostringa che matcha, devi lavorare un pochino per trovare alla fine. |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
quella sopra è una bella idea ed anche piuttosto performante, di primo acchito, fa una differenza di indirizzi e posiziona il puntatore nella posizione quasi di fine stringa sottraendo la lunghezza del campione da verificare |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
Quote:
Comunque volendo essere puntigliosi, in caso negativo (trovo un carattere che sicuramente non appartiene alla stringa) strstr fallisce prima di strcmp (che in realtà non fallisce mai, fa sempre la differenza di bytes) ![]() Nota: puoi posizionarti alla fine della stringa e fare comunque una ricerca con strstr. Ma sono dettagli. ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:22.