Jak sprawdzić czy "string" jest poprawnie zapisany w cudzysłowie ? np. ze w pliku nie bedzie "stri"ng albo "string"""
Brzmi jak bardzo dziwny problem do rozwiązania, co tak na prawdę próbujesz zrobić?
Podaj więcej szczegółów i kontekstu.
chce sprawdzic czy w pliku json "string" jest cudzyslowie np. w json : "string" i cyz po : string jest poprawnie zapisany w cudzyslowie
Chce to zrobić w c++ bez json biblioteki
-
std::regex
(lub coś wydajniejszego) i odpowiednie wyrażenie regularne. - Ręczne czytanie pliku znak po znaku.
Jeśli odrzucasz przypadek escape’owania cudzysłowów, tzn. "klucz": "wartość \" z wyescape’owanym cudzysłowem";
, to być może Twój przypadek da się sprowadzić do „zero, dwa lub cztery "
w każdej linii” + „"
może być bezpośrednio poprzedzony tylko znakami białymi, lub :
i znakami białymi, lub {
i znakami białymi” + „bezpośrednio po "
mogą wystąpić znaki białe i :
, lub znaki białe i ;
, lub znaki białe i }
”.
Tym niemniej porada „użyj gotowego walidatora JSON-a” pokryje Ci znacznie więcej przypadków i będzie znacznie mniej błędogenna.
dayanuch napisał(a):
Jak sprawdzić czy "string" jest poprawnie zapisany w cudzysłowie ? np. ze w pliku nie bedzie "stri"ng albo "string"""
A dlaczego nie ?
"stri"
jest bardzo fajnych stringiem wg podanej definicji
podobnie "string"
jest bardzo ładny, a że POZA NIM jest jeszcze jeden apostrof ...
Dopóki nie wysilisz głowy, i nie zdefiniujesz dokładnie zagadnienia, na porządne tego zrobienie nie masz szans.
Również my nie mamy szans niczego skutecznego doradzić
Postawienie "żeby w pliku znaleźć string w pazurkach a reszta mnie nie obchodzi" jest źle zdefiniowanym zagadnieniem i być może nie do rozwiazania
Dwukrotne użycie funkcji C strchr
da wynik,
char * p1 = strchr(zawartosc, '"');
if(p1!=null)
{
char * p2 = strchr(p1+1,'"');
}
... tylko niczego w rzeczywistości to nie weryfikuje. Ew drugie wywołanie z strrchr
- bez znaczenia o ile nie doprecyzujesz celów.
Jak na razie, w tzreciej "próbie objaśnienia" tematu tylko sie powtarzasz mantrę. Metoda "przecież bardzo chcę" niestety nie wystarczy
- czym jest upragniony string - jakie znaki może zawierać
- co w pliku może być oprócz "upragnionego stringa"
dayanuch napisał(a):
chce sprawdzic czy w pliku json "string" jest cudzyslowie np. w json : "string" i cyz po : string jest poprawnie zapisany w cudzyslowie
-
Czyli spodziewasz się dostać niepoprawnego JSONa, i próbujesz sprawdzić czy jest poprawny czy nie? Np
{"a":"x" "x"}
-
Czy może spodziewasz się dostać poprawny JSON, i chcesz sprawdzić czy występuje jakiś konkretny ciąg znaków w którymś kluczu?
{"a":"inny string"}
a Ty chcesz znaleźc tylko
"string"
?I odpowiadając na drugie pytanie:
dayanuch napisał(a):
Chce to zrobić w c++ bez json biblioteki
Jaki masz powód żeby nie używać biblioteki?
dayanuch napisał(a):
Chce to zrobić w c++ bez json biblioteki
Czyli sam chcesz napisać parser JSon-a?
No to czeka cię sporo pracy.
Możesz skorzystać, boost spirit (biblioteka pomagająca pisać ogólnie parsery), albo robić to krok po kroku samemu.
W tym celu zacznij od przeczytania oficjalnej specyfikacji JSona: RFC-8259.
Może też ktoś ci rekomenduje jakiś podręcznik, jak dobrze pisać parsery.
Na razie możemy tyle ci powiedzieć, bo towoje pytanie jest zbyt, ogólne.
Przyjdź z czymś bardziej konkretnym (wąskim problemem), pokaż jakiś kod który ci nie działa i wyjaśnij dokładnie co kod ma robić.
Próbowałem w taki sposób że znajduje : w pliku i następnie sprawdzam że po nim może być tylko null
, true
, false
i liczba, i ten string
char * p1 = strchr(zawartosc, '"');
if(p1!=null)
{
char * p2 = strchr(p1+1,'"');
}
Tym próbowałem, ale do tego trzeba dodać że "
nie może być znaków i nie wiem czy do to końca działa poprawnie
dayanuch napisał(a):
Próbowałem w taki sposób że znajduje : w pliku i następnie sprawdzam że po nim może być tylko
null
,true
,false
i liczba, i ten stringchar * p1 = strchr(zawartosc, '"'); if(p1!=null) { char * p2 = strchr(p1+1,'"'); }
Tym próbowałem, ale do tego trzeba dodać że
"
nie może być znaków i nie wiem czy do to końca działa poprawnie
Oczywiście że nie działa poprawnie, nie tak należy podejść do tego problemu.
@dayanuch: Opisz dokładnie co próbujesz zrobić, z większym kontekstem.
Rozmawiałem z autorem wątku na priv, i z tego co rozumiem to autor chce napisać sam parser JSON'a.
- Ma się wywalić, jak dostanie niepoprawny JSON
- Ma parsować tylko pierwszy poziom obiektu (czyli zagnieżdżone obiekty i zagnieżdżone listy są traktowane jako niepoprawny input)
- Ma sprawdzić czy w podanym JSON'ie znajduje się zadana wartość tekstowa (tzn ma sprawdzić czy istnieje np wartość
"car"
, ale wartość"carpet"
ma nie być uznana za znalezioną).
@dayanuch: A skoro tak, to nie mam dla Ciebie dobrych wiadomości, bo nie da się tego załatwić "jedna funkcją", musisz przeiterować po każdym znaku Twojego wejścia, i odpowiednio go sparsować. Nie możesz po prostu użyć sobie strchr()
i wyciągnąć wartośc, bo taki algorytm mógłby zostać bardzo łatwo oszukany takim wejściem:
{
"klucz": "{\"fake-key\": \"fake value\", \"other-key\": 12}",
"other-key": "value"
}
Napisanie takiego parsera, to dużo pracy, zwłaszcza jeśli ma parsować np JSON' z Unicode, i miałby się wywalić dla niepoprawny code'pointów unicode.
Nadal nie rozumiem czemu chcesz napisać swoj parser, zamiast skorzystać z istniejącego?
MarekR22 napisał(a):
dayanuch napisał(a):
Chce to zrobić w c++ bez json biblioteki
Czyli sam chcesz napisać parser JSon-a?
No to czeka cię sporo pracy.
Możesz skorzystać, boost spirit (biblioteka pomagająca pisać ogólnie parsery), albo robić to krok po kroku samemu.
W tym celu zacznij od przeczytania oficjalnej specyfikacji JSona: RFC-8259.
Może też ktoś ci rekomenduje jakiś podręcznik, jak dobrze pisać parsery.Na razie możemy tyle ci powiedzieć, bo towoje pytanie jest zbyt, ogólne.
Przyjdź z czymś bardziej konkretnym (wąskim problemem), pokaż jakiś kod który ci nie działa i wyjaśnij dokładnie co kod ma robić.
"Z jakich części jest zbudowana rakieta Saturn V, bo chcę ją zrobić i polecieć na Ksieżyć"
No to czeka cię sporo pracy.
W przypadku umiejętności OP, nieskończenie dużo pracy. Nie tylko koderskich, tego chyba można się nauczyć, ale elementarne logiczne wyrażanie myśli bardzo cierpi. MSZ boost::spityt to "trochę" poza zasięgiem OP.
@dayanuch:
parsowanie, nawet uproszczonego pod-standardu (jako zadanie szkolne - może mi się pdoobać), to może nie genialny proces, ale bardzo systematyczny (tak systematyczny, że od dawna są bdb generatory parserów). *)
Mozesz o tym myśleć jako (rekurencyjna) maszyna stosowa
- czy otworzył nam się poprawny obiekt JSON: tak / nie
- jeśli tak, próbujemy analizować pierwszą właściwość, pierwsza oczekiwana jest prawidłowa nazwa
- jeśli jest prawidłowo zaczęta ... itd.
Kazdy element gramatyki przekłada się na podfunckję / metodę, if
, while
, do while
(lub zrywa przetwarzanie uznjaąc plik za błędny)
*)
jest eleganckie i łatwe (choć pracochłonne) jak już się to "ma" - jest niemożliwe metodą rąbania na siłę.
Pamiętam na studiach, BARDZO CHCIAŁEM (o wiele wyprzedzajac program) napisać parser czegoś tam prostego, w ciągu kilku mc niczego nie uzyskałem, tylko syfiaste spagetti. Rok później w ciągu mniej niż miesiąca napisałem parser wiele bardziej złożonego języka , z wysoką niezawodnością, elastycznością na poprawki (gramatyki pliku) - gdy już rozumiałem teoretycznie.