Próbuję wysłać dwa polecenia jednocześnie z Sprintf. Polecenia powinny być rozdzielone 0x0a (LF). Myślałem, że mogę wprowadzić znaki specjalne za pomocą dwóch cięć, więc piszę:

sprintf(tmpstr,"VSET1:%ld.%3.3d\\x0AVSET2:%ld.%3.3d",mv/1000, AbsVal((int)mv%1000), mv / 1000, AbsVal((int)mv % 1000));

I wydaje się tylko drugie polecenie (VSET2) jest rozpoznawane.

Co ja robię źle?

2
abovady 2 czerwiec 2018, 00:57

4 odpowiedzi

Najlepsza odpowiedź

Użyj \n w ciągu formatu. Również użyj pojedynczego ukośnika odwrotnego nie \\.

Jeśli piszesz bufor do pliku, otwórz plik w trybie binarnym.

Niezależnie od tego, czy używasz \n lub \x0A, musisz otworzyć plik w trybie binarnym, aby uniknąć tłumaczeń nie przenośnych.

Zobacz Sekwencje ucieczki.

2
Sid S 2 czerwiec 2018, 06:03

Gdy używasz \\x0A w dosłownie, pierwszy odwrót uklaska ucieknie z drugiego odwrotnego ukośnika. W rezultacie ciąg zawiera znak odwrotnego ukośnika, '\\', a następnie znaki 'x', '0' i 'A'.

Aby użyć znaku reprezentowanego przez 0x0A, musisz użyć \x0A.

0
R Sahu 1 czerwiec 2018, 22:05

Powinieneś użyć jednego odwrotnego ukośnika zamiast dwóch odwrotnych ukośników. Wypróbuj oświadczenie podane poniżej:

sprintf(tmpstr,"VSET1:%ld.%3.3d\x0AVSET2:%ld.%3.3d",mv/1000, AbsVal((int)mv%1000), mv / 1000, AbsVal((int)mv % 1000));

Jednak to, co zrobiłeś w swoim programie, wydrukować ciąg "\x0A", a nie znaka ASCII (0xAA (Line Feed)).

W C, wszystkie sekwencje ucieczki składają się z dwóch lub więcej znaków, z których pierwsza jest odwrotna ukośnik, \ (zwany "postać ucieczki"); Pozostałe znaki określają interpretację sekwencji ucieczki.

C Udaj się domyślnie odwrotnych ukośników jako sekwencje ucieczki. Jednak w twoim programie powiedziałeś kompilator C, aby nie używać odwrotnego ukośnika jako sekwencji ucieczki, dodając dodatkowy ukośnik odwrócony do swojego ciągu.

0
abhiarora 1 czerwiec 2018, 22:18

Działa to idealne. Nie tylko wstawisz, ale wygląda poprawnie w kodzie. Nie ma potrzeby na koniec linii. Używam tego dla dużych akapitów. Dane osobowe zostały zaciemnione.

enter code here

Wchar_t MSG [200]; SWPRINTF (MSG, L "XYZ% D: ABCD limit ustawiony na% d %%.% d razy ma ABCD i XYZ RSTU% D %% N" "Czy chcesz to naprawić? napraw to

0
Santhosh Kumar 4 styczeń 2019, 17:27