2017-11-30 336 views

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.

+0

Może „atomowy” string literal jest lepszy opis. –

+0

@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

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') –