Czy ciąg znaków o stałej długości, taki jak "foo" "\x01" "bar"
, może być zapisany jako pojedynczy ciąg literowy (przy jednoczesnym zachowaniu zapisu szesnastkowego)? Z "foo\x01bar"
sekwencja ucieczki wydaje się być interpretowana jako \x01ba
, ponieważ otrzymuję ostrzeżenie "hex escape sequence from the range".Rozdzielanie sekwencji heksadecymalnych w łańcuchach znaków
6
A
Odpowiedz
3
"foo" "\x01" "bar"
jest ciąg literału.
Standard C stwierdza, że szesnastkowa sekwencja specjalna jest najdłuższą sekwencją znaków, która może stanowić sekwencję specjalną. Bez jawnej konkatenacji (co jest powszechnym obejściem tego problemu) kompilator analizuje \x01ba
, który jest oczywiście poza zakresem.
1
Co powiecie na "foo\x01\142ar"
? Czy to oszustwo?
1
Innym rozwiązaniem jest po prostu napisać uciekł charakter w ósemkowym, szesnastkowym zamiast
"foo\1bar"
i nie więcej niejednoznaczności ...
+0
(a jeśli "bar" jest liczbą, użyj do 3 cyfr ósemkowych, takich jak '\ 001') –
Może „atomowy” string literal jest lepszy opis. –
@AugustKarlstrom: Niestety, sekwencja-heksadecymalna * jest * zdefiniowana * jako dowolna liczba poprawnych cyfr szesnastkowych następujących po '\ x'. W przeciwieństwie do tego, * ósemkowa * -sekwencyjna-sekwencja ('\ 001') działa nie dłużej niż trzy cyfry ósemkowe (* 6.4.4.4 stałe znaków *). Tak więc, nie, musisz albo "zagrywać sztuczki" z notacją szesnastkową, albo wybierać ósemkowe (co nie jest * złe *, gdy się do tego przyzwyczaisz). – DevSolar