PDA

View Full Version : [C] carattere di una stringa


misterx
25-07-2012, 19:45
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?

misterx
26-07-2012, 08:33
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.

GByTe87
26-07-2012, 09:31
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.

#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");
}

misterx
26-07-2012, 12:22
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.

#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");
}


ottima idea, grazie :)

british
26-07-2012, 14:21
Già che ci sono vi chiedo qual'è il modo più furbo per verificare se in una stringa esiste nella sua parte finale una sottostringa


Usando la libreria standard:


#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;
}

}


ciao!

misterx
26-07-2012, 14:37
Usando la libreria standard:


#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;
}

}


ciao!


bella idea, grazie 1000

WarDuck
30-07-2012, 20:09
Usa strstr :D.

http://linux.die.net/man/3/strstr

Fa una ricerca ottimizzata (usa l'algoritmo di Boyer-Moore (http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm)) 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.

misterx
01-08-2012, 20:31
Usa strstr :D.

http://linux.die.net/man/3/strstr

Fa una ricerca ottimizzata (usa l'algoritmo di Boyer-Moore (http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm)) 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.



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

WarDuck
01-08-2012, 23:28
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

Si infatti, stavo rivedendo, avevo risposto velocemente e non avevo capito bene cosa volessi fare.

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) :D.

Nota: puoi posizionarti alla fine della stringa e fare comunque una ricerca con strstr.

Ma sono dettagli. :read: