printf, fprintf, sprintf, snprintf, wsprintf, vprintf, vfprintf, vsprintf, vwsprintf, ou vdprintf Subroutine

Propósito

Imprime saída formatada.

Biblioteca

Biblioteca C Padrão (libc.a) ou a Biblioteca C Padrão com duplas de 128 bits (libc128.a)

Sintaxe

#include <stdio.h>

int printf (Format, [Value, ...])
const char *Format;

int fprintf (Stream, Format, [Value, ...])
FILE *Stream;
const char *Format;

int sprintf (String, Format, [Value, ...])
char *String;
const char *Format;

int snprintf (String, Number, Format, [Value, . . .])
char *String;
int Number;
const char *Format;
#include <stdarg.h>

int vprintf (Format, Value)
const char *Format;
va_list Value;

int vfprintf (Stream, Format, Value)
FILE *Stream;
const char *Format;
va_list Value;

int vsprintf (String, Format, Value)
char *String;
const char *Format;
va_list Value;

int vdprintf (fildes, Format, Value);
int fildes;
const char *Format;
va_list Value;
#include <wchar.h>

int vwsprintf (String, Format, Value)
wchar_t *String;
const char *Format;
va_list Value;

int wsprintf (String, Format, [Value, ...])
wchar_t *String;
const char *Format;

Descrição

O subroutine printf converte, formatos e grava os valores de parâmetro Value , sob controle do parâmetro Format , para o fluxo de saída padrão. A subroutine printf fornece tipos de conversão para manipular pontos de código e códigos de caracteres de largura wchar_t .

O subroutine fprintf converte, formatos e grava os valores de parâmetro Value , sob controle do parâmetro Format , para o fluxo de saída especificado pelo parâmetro Stream . Esta subroutine fornece tipos de conversão para manipular pontos de código e códigos de caracteres de largura wchar_t .

O subroutine sprintf converte, formata e armazena os valores de parâmetro Value , sob controle do parâmetro Format , em bytes consecutivos, iniciando no endereço especificado pelo parâmetro String . A subroutina sprintf coloca um caractere nulo (\0) no final. Você deve garantir que o espaço de armazenamento suficiente esteja disponível para conter a sequência formatada. Esta subroutine fornece tipos de conversão para manipular pontos de código e códigos de caracteres de largura wchar_t .

O subroutine snprintf converte, formatos e armazena os valores de parâmetro Value , sob controle do parâmetro Format , em bytes consecutivos, iniciando no endereço especificado pelo parâmetro String . A subroutina snprintf coloca um caractere nulo (\0) no final. Você deve garantir que o espaço de armazenamento suficiente esteja disponível para conter a sequência formatada. Esta subroutine fornece tipos de conversão para manipular pontos de código e códigos de caracteres de largura wchar_t . A subroutine snprintf é idêntica à subroutina sprintf com a adição do parâmetro Number , que afirma o tamanho do buffer referido pelo parâmetro String .

O subroutine de wsprintf converte, formatos e armazena os valores de parâmetro Value , sob controle do parâmetro Format , em caracteres wchar_t consecutivos iniciando no endereço especificado pelo parâmetro String . A subroutina wsprintf coloca um caractere nulo (\0) no final. O processo de chamada deve garantir que o espaço de armazenamento suficiente esteja disponível para conter a sequência formatada. A unidade de largura de campo é especificada como o número de caracteres wchar_t . O subroutine wsprintf é o mesmo que o subroutine printf , exceto que o parâmetro String para a subroutine wsprintf usa uma string de códigos de caracteres de wchar_t de caracteres.

Todas as subroutines acima funcionam chamando a subroutine _doprnt , usando instalações de argumento de comprimento variável dos macros varargs .

Os vdprintf, vprintf, vfprintf, vsprintfe vwsprintf subroutines format e escreva listas de parâmetros de macros varargs . Estas subroutines são as mesmas do drpintf, printf, fprintf, sprintf, snprintfe subroutines de wsprintf , respectivamente, exceto que não são chamadas com um número variável de parâmetros. Em vez disso, eles são chamados com um ponteiro de lista de parâmetros conforme definido pelos macros varargs .

Nota: Iniciando com o IBM® AIX® 6 com Technology Level 7 e o IBM AIX 7 com Technology Level 1, a precisão das rotinas de conversão de ponto flutuante, printf e scanf família de funções foi aumentada de 17 dígitos para 37 dígitos para valores duplos e longos.

Parâmetros

Número
Especifica o número de bytes em uma string a ser copiada ou transformada.
Valor
Especifica 0 ou mais argumentos que mapeam diretamente para os objetos no parâmetro Format .
Fluxo
Especifica o fluxo de saída.
Sequência
Especifica o endereço inicial.
Formato
Uma sequência de caracteres que contém dois tipos de objetos:
  • Caracteres simples, que são copiados para o fluxo de saída.
  • Especificações de conversão, cada uma delas faz com que 0 ou mais itens sejam recuperados da lista de parâmetros Valor . No caso das subroutines vprintf, vfprintf, vsprintfe vwsprintf , cada especificação de conversão faz com que 0 ou mais itens sejam recuperados das listas de parâmetros de macros varargs .

    Se a lista de parâmetros Value não contém itens suficientes para o parâmetro Format , os resultados são imprevisíveis. Se mais parâmetros permanecem após o parâmetro de Formato inteiro ter sido processado, a subroutine ignora-os.

    Cada especificação de conversão no parâmetro Format tem os seguintes elementos:

  • A% (sinal de percentual).
  • 0 ou mais opções, que modificam o significado da especificação de conversão. Os caracteres de opção e seus significados são:
    '
    Formata as porções de número inteiro resultantes de i, d, u, f, g e G conversões decimais com milands_sep caracteres de agrupamento. Para outras conversões o comportamento é indefinido. Esta opção usa o caráter de agrupamento não monetário.
    -
    Esquerda-justifica o resultado da conversão dentro de campo.
    +
    Inicia-se o resultado de uma conversão assinada com um + (sinal de mais) ou-(sinal de menos).
    caractere de espaço
    Prefixa um caractere de espaço para o resultado se o primeiro caractere de uma conversão assinada não for um sinal. Se ambos os caracteres de opção de espaço-espaço e + aparecer, a opção espaço-caracteres será ignorada.
    #
    Converte o valor para um formulário alternativo. Para as conversões c, d, s, e u , a opção não tem efeito. Para a conversão o , aumenta a precisão para forçar o primeiro dígito do resultado a ser um 0. Para as conversões x e X , um resultado não zero tem um prefixo 0x ou 0X . Para as conversões e, E, f, ge G , o resultado sempre contém um ponto decimal, mesmo que nenhum algarismo o acompanhais. Para as conversões g e G , as 0's trailing's não são removidas do resultado.
    0
    Pads à largura de campo com os principais 0's (seguindo qualquer indicação de sinal ou base) para d, i, o, u, x, X, e, E, f, ge G conversões; o campo não é espaço-acolchado. Se as opções 0 e - aparecidas, a opção 0 é ignorada. Para d, i, o u, x, e X conversões, se uma precisão for especificada, a opção 0 também é ignorada. Se as opções 0 e ' aparecer, agrupar caracteres são inseridos antes que o campo seja acoleado. Para outras conversões, os resultados não são confiáveis.
    B
    Especifica um caractere sem op.
    n
    Especifica um caractere sem op.
    J
    Especifica um caractere sem op.
  • Uma cadeia de dígito decimal opcional que especifica a largura do campo mínimo. Se o valor convertido tiver menos caracteres do que a largura do campo, o campo é acolado na esquerda para o comprimento especificado pela largura do campo. Se a opção - (esquerdas esquerdas) for especificada, o campo é acolado à direita.
  • Uma precisão opcional. A precisão é um . (ponto) seguido de uma sequência de dígitos decimais. Se nenhuma precisão for especificada, o valor padrão é 0. A precisão especifica os seguintes limites:
    • Número mínimo de dígitos para aparecer para as conversões d, i, o, u, xou X .
    • Número de dígitos para aparecer após o ponto decimal para as conversões e, Ee f .
    • Número máximo de algaridades significativas para conversões g e G .
    • Número máximo de bytes a serem impressos a partir de uma string em conversões s e S .
    • Número máximo de bytes, convertidos da matriz wchar_t , para serem impressos a partir das conversões S . Apenas caracteres completos são impressos.
  • An opcional l (lowercase L), ll (lowercase LL), hou L especificadora indica um dos seguintes:
    • Um h opcional especificando que um especificador de conversão de d, eu, u, o, xou X , aplica-se a um parâmetro curta int ou curta int unsigned Valor (o parâmetro terá sido promovido de acordo com as promoções integrais, e seu valor será convertido em um curta int ou curta int unsigned antes da impressão).
    • Um h opcional especificando que um especificador de conversão n subsequente aplica-se a um ponteiro a um parâmetro short int .
    • Um l opcional (lowercase L) especificando que um especificador de conversão d, eu, u, o, xou X , aplica-se a um parâmetro longa int ou longo int unsigned .
    • Um l opcional (lowercase L) especificando que um especificador de conversão n subsequente aplica-se a um ponteiro a um parâmetro long int .
    • Um ll opcional (lowercase LL) especificando que um d, i, u, o, xou X especificador de conversão aplica-se a um parâmetro long long int ou unsigned long long int .
    • Um ll opcional (lowercase LL) especificando que um especificador de conversão n subsequente aplica-se a um ponteiro a um parâmetro long long int .
    • Um L opcional especificando que um seguinte e, E, f, gou G especificador de conversão aplica-se a um parâmetro long double . Se vinculado a libc.a, long double será o mesmo que double (64bits). Se vinculado a libc128.a e libc.a, long double será de 128 bits
  • Um especificador opcional H, Dou DD indica uma das conversões a seguir:
    • Um H opcional especificando que um seguinte especificador e, E, f, F, gou G , aplica-se a um parâmetro _Decimal32 .
    • Um D opcional especificando que um seguinte especificador e, E, f, F, gou G , aplica-se a um parâmetro _Decimal64 .
    • Um DD opcional especificando que um seguinte especificador e, E, f, F, gou G , aplica-se a um parâmetro _Decimal128 .
  • Um vlopcional, lv, vh, hv ou v especificador indica uma das seguintes conversões do tipo de dados vetores:
    • Um v opcional especificando que um especificador de conversão de e, E, f, g, G, aou A , aplica-se a um parâmetro vector float . Ele consome um argumento e interpreta os dados como uma série de quatro componentes flutuantes de 4-byte pontos flutuantes.
    • Um v opcional especificando que um especificador de conversão c, d, i, u, o, xou X , aplica-se a um parâmetro vector signed char, vector unsigned charou vector bool char . Ele consome um argumento e interpreta os dados como uma série de dezesseis componentes de 1-byte.
    • Um opcional vl ou lv especificando que um especificador de conversão de d, i, u, o, xou X , aplica-se a um parâmetro vector signed int, vector unsigned intou vector bool . Ele consome um argumento e interpreta os dados como uma série de quatro componentes inteiros de 4-byte bits.
    • Um vh opcional ou hv especificando que um seguinte d, i, u, o, xou X specifier de conversão aplica-se a um parâmetro vector signed short ou vector unsigned short . Ele consome um argumento e interpreta os dados como uma série de oito componentes inteiros de 2-byte.
    • Para qualquer um dos especificadores precedentes, um caractere separador opcional pode ser especificado imediatamente precedendo o especificador de tamanho do vetor. Se nenhum separador for especificado, o separador padrão é um espaço a menos que a conversão seja c, caso em que o separador padrão é nulo. O conjunto de separadores opcionais suportados são , (vírgula), ; (ponto e vírgula), : (dois colon) e _ (sublinhado).
  • Os caracteres a seguir indicam o tipo de conversão a ser aplicada:
    %
    Não executa nenhuma conversão. Imprime (%).
    d ou i
    Aceita um parâmetro Value especificando um número inteiro e converte-o para notação decimal assinada. A precisão especifica o número mínimo de digitos a aparecer. Se o valor que está sendo convertido pode ser representado em menos dígitos, ele é expandido com os principais 0's. A precisão padrão é 1. O resultado da conversão de um valor de 0 com uma precisão de 0 é uma sequência nula. Especificar uma largura de campo com um 0 como um caractere de liderança faz com que o valor de largura de campo seja preenchida com os 0 principais's.
    u
    Aceita um parâmetro Value especificando um inteiro não assinado e converte-o para notação decimal não assinada. A precisão especifica o número mínimo de digitos a aparecer. Se o valor que está sendo convertido pode ser representado em menos dígitos, ele é expandido com os principais 0's. A precisão padrão é 1. O resultado da conversão de um valor de 0 com uma precisão de 0 é uma sequência nula. Especificar uma largura de campo com um 0 como um caractere de liderança faz com que o valor de largura de campo seja preenchida com os 0 principais's.
    o
    Aceita um parâmetro Value especificando um inteiro não assinado e converte-o em notação octal não assinada. A precisão especifica o número mínimo de digitos a aparecer. Se o valor que está sendo convertido pode ser representado em menos dígitos, ele é expandido com os principais 0's. A precisão padrão é 1. O resultado da conversão de um valor de 0 com uma precisão de 0 é uma sequência nula. Especificar um campo-largura com um 0 como um caractere de liderança faz com que o valor da largura do campo seja preenchida com os 0 principais's. Um valor octal para largura de campo não está implícito.
    x ou X
    Aceita um parâmetro Value especificando um inteiro não assinado e converte-o para notação hexadecimal não assinada. As letras abcdef são usadas para a conversão x e as letras ABCDEF são usadas para a conversão X . A precisão especifica o número mínimo de digitos a aparecer. Se o valor que está sendo convertido pode ser representado em menos dígitos, ele é expandido com os principais 0's. A precisão padrão é 1. O resultado da conversão de um valor de 0 com uma precisão de 0 é uma sequência nula. Especificar uma largura de campo com um 0 como um caractere de liderança faz com que o valor de largura de campo seja preenchida com os 0 principais's.
    f
    Aceita um parâmetro Value especificando uma dupla e converte-a em notação decimal no formato [-]ddd.ddd. O número de algaritos após o ponto decimal é igual à especificação de precisão. Se nenhuma precisão for especificada, seis algarías são saída. Se a precisão for 0, nenhum ponto decimal aparece.
    e ou E
    Aceita um parâmetro Value especificando um duplo e o converte no formato exponencial [-]d.ddde+/-dd. Um dígito existe antes do ponto decimal, e o número de algarismos após o ponto decimal é igual à especificação de precisão. A especificação de precisão pode estar na faixa de 0-17 dígitos. Se nenhuma precisão for especificada, seis algarías são saída. Se a precisão for 0, nenhum ponto decimal aparece. O caractere de conversão E produz um número com E em vez de e antes do expoente. O expoente sempre contém pelo menos dois algaríos.
    g ou G
    Aceita um parâmetro Value especificando uma dupla e converte-a no estilo dos caracteres de conversão e, Eou f , com a precisão especificando o número de dígitos significativos. Trailing 0's são removidos do resultado. Um ponto decimal aparece apenas se for seguido por um dígito. O estilo usado depende do valor convertido. O estilo e (E, se G for o sinalizador usado) resulta somente se o expoente resultante da conversão for menor que -4, ou se for maior ou igual à precisão. Se uma precisão explícita for 0, ela é tomada como 1.
    c
    Aceita e imprime um parâmetro Value especificando um inteiro convertido para um tipo de dados unsigned char .
    C
    Aceita e imprime um parâmetro Value especificando um código de caracteres amplo wchar_t . O código de caracteres amplo wchar_t especificado pelo parâmetro Value é convertido em uma matriz de bytes representando um caractere e esse caractere é escrito; o parâmetro Value é escrito sem conversão ao usar a subroutina wsprintf .
    s
    Aceita um parâmetro Value como uma string (pointer de caracteres), e caracteres da string são impressos até que um caractere nulo (\0) seja encontrado ou o número de bytes indicados pela precisão seja atingido. Se nenhuma precisão for especificada, todos os bytes até o primeiro caractere nulo são impressos. Se o ponteiro string especificado pelo parâmetro Value tiver um valor nulo, os resultados não são confiáveis.
    S
    Aceita um parâmetro Value correspondente como um ponteiro para uma string wchar_t . Caracteres da sequência são impressos (sem conversão) até que um caractere nulo (\0) seja encontrado ou o número de caracteres amplos indicado pela precisão seja atingido. Se nenhuma precisão for especificada, todos os caracteres até o primeiro caractere nulo são impressos. Se o ponteiro string especificado pelo parâmetro Value tiver um valor de null, os resultados não são confiáveis.
    P
    Aceita um ponteiro para anular. O valor do ponteiro é convertido para uma sequência de caracteres imprimíveis, o mesmo que um hexadecimal não assinado (x).
    n
    Aceita um ponteiro para um inteiro no qual está escrito o número de caracteres (códigos de caracteres amplos no caso da subroutine de wsprintf ) gravado no fluxo de saída por esta chamada. Nenhum argumento é convertido.
 

Uma largura de campo ou precisão pode ser indicada por um * (asterisco) em vez de uma sequência de algarismos. Neste caso, um parâmetro Value inteiro fornece a largura de campo ou precisão. O parâmetro Valor convertido para saída não é recuperado até que a letra de conversão seja atingida, portanto, os parâmetros especificando largura de campo ou precisão devem aparecer antes do valor (se houver) a ser convertido.

Se o resultado de uma conversão for mais largo que a largura do campo, o campo será expandido para conter o resultado convertido e não ocorrerá o truncamento. No entanto, uma pequena largura de campo ou precisão pode causar truncamento à direita.

O printf, fprintf, sprintf, snprintf, wsprintf, vprintf, vfprintf, vsprintfou vwsprintf subroutine permite a inserção de um caractere de radix dependente de linguagem na cadeia de saída. O caractere radix é definido por dados específicos da linguagem na categoria LC_NUMÉRICA do locale do programa. No locale C, ou em um locale onde o caractere radix não é definido, o caractere de radix padronizado para um. (ponto).

Depois que qualquer uma dessas subroutines for executada com sucesso, e antes da próxima conclusão bem-sucedida de uma chamada para a subroutine fclose ou fflush no mesmo fluxo ou para a subroutine exit ou abort , ost_ctimeest_mtimeos campos do arquivo estão marcados para atualização.

Os especificadores de conversão e, E, f, ge G representam os valores especiais de ponto flutuante da seguinte forma:

Item Descrição
Silencioso NaN +NaNQ ou -NaNQ
Sinalização NaN +NaNS ou -NaNS
+/-INF + INF ou -INF
+/-0 +0 ou -0

A representação do + (sinal de mais) depende de se a opção de formatação de caracteres + ou espaço-de-caracteres é especificada.

Estas subroutines podem manipular uma string de formato que possibilita que o sistema processe elementos da lista de parâmetros em ordem variável. Em tal caso, o caractere de conversão normal% (sinal de percentual) é substituído por %dígito$, em que dígito é um número decimal na faixa a partir de 1 para o valor NL_ARGMAX . A conversão é então aplicada ao argumento especificado, em vez de para o próximo argumento não utilizado. Este recurso prevê a definição de strings de formato em uma ordem apropriada para linguagens específicas. Quando a ordenação de variáveis é usada a especificação * (asterisco) para largura de campo em precisão é substituída por %dígito$. Se você usar o recurso de ordenação de variáveis, você deve especificá-lo para todas as conversões.

Aplicam-se os seguintes critérios:

  • O formato passado para as extensões NLS pode conter o formato da conversão ou o número de argumento explícito ou implícito. No entanto, esses formulários não podem ser misturados dentro de uma única string de formato, exceto para %% (sinal de percentual duplo).
  • O valor n não deve ter zeros iniciais.
  • Se %n$ for usado, %1$ para %n- 1$ inclusivo deve ser usado.
  • O n em %n$ está na faixa a partir de 1 para o valor NL_ARGMAX , inclusive. Consulte o arquivo limits.h para obter mais informações sobre o valor NL_ARGMAX .
  • Argumentos numerados na lista de argumentos podem ser referenciados quantas vezes for necessário.
  • A especificação * (asterisco) para largura de campo ou precisão não é permitida com a ordem variável %n$ formato; em vez disso, é usado o formato *m$ .

Valores De Retorno

Após a conclusão bem-sucedida, as subroutines printf, fprintf, vprintfe vfprintf retornam o número de bytes transmitidos (não incluindo o caractere nulo [\0] no caso das subroutines sprintfe vsprintf ). Se um erro foi encontrado, um valor negativo é saída.

Após a conclusão bem-sucedida, a subroutina snprintf retorna o número de bytes gravados no parâmetro String (excluindo o byte null terminante). Se os caracteres de saída forem descartados porque a saída excedeu o parâmetro Número no comprimento, então a subroutina snprintf retorna o número de bytes que teria sido gravado no parâmetro String se o parâmetro Número tivesse sido grande o suficiente (excluindo o byte null terminating).

Após a conclusão bem-sucedida, as subroutines wsprintf e vwsprintf retornam o número de caracteres amplos transmitidos (não incluindo o caractere nulo de caracteres amplos [\0]). Se um erro foi encontrado, um valor negativo é saída.

Códigos De Erro

O printf, fprintf, sprintf, snprintf, ou wsprintf subroutine não é bem sucedido se o arquivo especificado pelo parâmetro Stream estiver sem buffer ou o buffer precisa ser flushed e um ou mais dos seguintes são verdadeiros:

Item Descrição
EAGAIN O sinalizador O_NONBLOCK ou O_NDELAY é configurado para o descritor de arquivo subjacente ao arquivo especificado pelo parâmetro Stream ou String e o processo seria retardado na operação de gravação.
EBADF O descritor de arquivo subjacente ao arquivo especificado pelo parâmetro Stream ou String não é um descritor de arquivo válido aberto para escrita.
EFBIG Foi feita uma tentativa de gravar em um arquivo que excede o limite de tamanho do arquivo deste processo ou o tamanho máximo do arquivo. Para obter mais informações, consulte a subroutina ulimit .
EINTR A operação de gravação finalizada devido ao recebimento de um sinal, e nem nenhum dado foi transferido ou uma transferência parcial não foi informada.
Nota: Dependendo de qual rotina da biblioteca o aplicativo se liga, esta subroutine pode retornar EINTR. Consulte a subroutina sinal em relação a sa_restart.
Item Descrição
EIO O processo é um membro de um grupo de processo de background tentando executar uma gravação em seu terminal de controle, o sinalizador TOSTOP é configurado, o processo não está ignorando nem bloqueando o sinal SIGTTOU , e o grupo de processos do processo não tem nenhum processo pai.
ENOSPC Nenhum espaço livre permanece no dispositivo que contém o arquivo.
EOVERFLOW

No modo UNIX03 , o subroutine snprintf ou vsnprintf não é bem-sucedido se o parâmetro value of Number for maior do que o valor de INT_MAX.

Nota: O comportamento UNIX03 está ativado, se o valor da variável de ambiente XPG_SUS_ENV for configurado como ON.
EPIPE Uma tentativa foi feita para escrever para um pipe ou first-in-first-out (FIFO) que não é aberto para leitura por qualquer processo. Um sinal SIGPIPE é enviado para o processo.

O printf, fprintf, sprintf, snprintfou wsprintf subroutine pode não ser bem sucedido se um ou mais dos seguintes forem verdadeiros:

Item Descrição
EILSEQ Uma sequência de caracteres inválida foi detectada.
EINVAL O parâmetro Format recebeu argumentos insuficientes.
ENOMEM O espaço de armazenamento insuficiente está disponível.
ENXIO Uma solicitação foi feita de um dispositivo inexistente, ou o pedido estava fora das capacidades do dispositivo.

Exemplos

O exemplo a seguir demonstra como a subroutine vfprintf pode ser usada para escrever uma rotina de erro:

#include <stdio.h>
#include <stdarg.h>
/* The error routine should be called with the
     syntax:       */
/* error(routine_name, Format
     [, value, . . . ]); */
/*VARARGS0*/
void error(char *fmt, . . .);
/* **  Note that the function name and
     Format arguments cannot be **
     separately declared because of the **
     definition of varargs.  */  {
   va_list args;

   va_start(args, fmt);
   /*
   ** Display the name of the function
      that called the error routine   */
   fprintf(stderr, "ERROR in %s: ",
      va_arg(args, char *));   /*
   ** Display the remainder of the message
   */
   fmt = va_arg(args, char *);
   vfprintf(fmt, args);
   va_end(args);
    abort();  }