Неопределенность в sprintf по поводу возврата символа '%' - PullRequest
0 голосов
/ 06 января 2019

Мне нужно вывести строку, которая начинается с символа% (% EE # WD ...), и я использую sprintf. Во многих ссылках я читал, что при использовании спецификатора% after% функция sprintf возвращает символ%.

Но для меня в разных компиляторах (таких как DEV C ++, JDOODLE) результат не тот, который я ожидал, и, наконец, я получил символ%, повторив спецификатор% 4 раза!

В чем причина?

Вот код и выводы:

#include <stdio.h>
int main()
{
    static char Command[10]   ;
    sprintf (Command,"%%EE#") ;
    printf  (Command)         ;    
    return 0                  ;
}

Выход: 3.205269E-317E #

#include <stdio.h>
int main()
{
    static char Command[10]     ;
    sprintf (Command,"%%%%EE#") ;
    printf  (Command)           ;    
    return 0                    ;
}

Выход: % EE #

Спасибо.

Ответы [ 4 ]

0 голосов
/ 06 января 2019

Передача результата sprintf в качестве первого аргумента printf приводит к тому, что он интерпретируется как строка формата. Таким образом, ваша строка интерпретируется как строка формата один раз для sprintf и снова для printf. Не делай этого.

Если вам не нужно форматирование, просто напечатайте строку с fputs, как в fputs("%EE#", stdout);. (puts похоже, но добавляет символ новой строки. fputs просто печатает символы, которые ему даны.)

Если вам нужно форматирование и вы можете печатать напрямую (без промежуточного буфера), используйте printf; не используйте sprintf заранее.

Если вам нужно отформатировать и записать результат в буфер, используйте sprintf и напечатайте буфер с fputs, а не printf.

0 голосов
/ 06 января 2019

%% даст вам % %E на самом деле относится к научной нотации, поэтому вам нужно набрать номер и вам нужно больше %, чтобы распечатать %E

0 голосов
/ 06 января 2019

После sprintf (Command,"%%EE#"), Command будет содержать %EE#. Если вы сейчас передадите это содержимое в printf как строку формата, то (сейчас) одиночный % будет интерпретирован как спецификатор формата, после чего будет найден аргумент float. Это не предусмотрено и ведет к неопределенному поведению. С sprintf (Command,"%%%%EE#") вы «преодолеете» эту проблему, поскольку Command будет содержать %%EE# тогда.

Но на самом деле вы должны написать ...

static char Command[10] = "%EE#";
printf  ("%s",Command);    

Или ...

static char Command[10];
strcpy(Command,"%EE#");
printf  ("%s",Command);    
0 голосов
/ 06 января 2019
sprintf (Command,"%%EE#") ;
printf  (Command)         ;    

%% в формате - это способ запроса на печать % , поэтому %% EE # производит % EE #

поэтому после того, как син сказал в замечании printf (команда) работает на % EE # , как если бы вы выполняли напрямую printf ("% EE #") и аргумент отсутствует, поэтому результат для "% E" является случайным

sprintf (Command,"%%%%EE#") ;
printf  (Command)           ;  

sprintf установить команду с "%% EE #", поэтому после того, как результат printf("%%EE#") будет% EE #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...