2010-04-07 10 views
6

Jeśli mam dwa rodzaje strun jak:sprawdzanie ostatni char string w C

const char *str1 = "This is a string with \"quotes escaped at the end\""; 
const char *str2 = "This is a \"string\" without quotes at the end"; 

testFn(str1); 
testFn(str2); 

int testFn(const char *str) 
{ 
    // test & return 1 if ends on no quote 
    // test & return 0 if ends on quote 
    return; 
} 

Chciałbym sprawdzić, czy ciąg kończy się cytat "lub nie

Jaki byłby dobry ten sposób testowania Dzięki

+5

Powinieneś to zmienić na 'int testFn (const char * str)' –

+0

Wielkie dzięki wszystkim! – radar75

+1

Nie zapomnij przyjąć jednej z odpowiedzi! ;-) – slacker

Odpowiedz

9

nie zapomnij upewnić się, że ciąg ma co najmniej 1 znak:

int testFn(const char *str) 
{ 
    return (str && *str && str[strlen(str) - 1] == '"') ? 0 : 1; 
} 
+0

Otrzymałeś wynik odwrócony. Sprawdź specyfikację podaną przez OP. – slacker

+0

@sler - tak, zauważyłem, że po napisałem, ale już zaktualizowałem mój przykład '': ' –

+2

' (wyrażenie)? 0: 1' jest zabawnym sposobem pisania '! (Wyrażenie)' :) – caf

4
int testFn(const char *str) 
{ 
    return !str || !*str || str[strlen(str) - 1] != '\"'; 
} 
+2

Niepoprawnie obsługuje łańcuch o długości 0. –

+0

Może ulec awarii na pustym ciągu – slacker

1
int testFn(const char *str) 
{ 
    if(*str && str[strlen(str + 1)] == '"') 
    return 0; 
    else 
    return 1; 
} 
+0

Pozdrawiam Cię na wskaźniku zerowym ;-) –

+0

@ Péter Török: Pewnie, że tak. Nie należy przekazywać go do tej funkcji, a następnie :). – slacker

+0

Jeśli nie przesyłasz ciągu o zerowej długości do mojego, nie przekażę pustego wskaźnika do twojego, OK? :-) –

-1

Łańcuch o długości zero ... nie jest ciągiem, to samo z numerem - nie obchodzi mnie, jak to zdefiniujesz. Wskaźniki zerowe wymagają własnej obsługi, ponieważ są one własną kategorią. Są wskaźniki dla głupoty z powrotem przeniesione, ale zabierze Cię tylko do tej pory. Musisz wszystko zdefiniować. Zaczynam od wskaźników zerowych, ponieważ NIC je obsługuje. Poczekaj ... Python ma. Może jesteś na niewłaściwym forum.

Teraz muszę znaleźć moją funkcję segfault. Wiem, że napisałem to, ponieważ utrzymuje odniesienia do istot - po prostu nie mogę tego znaleźć.

+0

Nie zapewnia to odpowiedzi na pytanie. Gdy masz już wystarczającą [reputację] (https://stackoverflow.com/help/whats-reputation), będziesz mógł [komentować dowolny wpis] (https://stackoverflow.com/help/privileges/comment); zamiast tego [dostarczaj odpowiedzi, które nie wymagają wyjaśnień od pytającego] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-zamiast). - [Z recenzji] (/ opinia/niskiej jakości-posts/18842954) –