Thursday 24 January 2019

Printf format codes binary options


O comando printf Estranho, este é um tópico muito grande que precisa de experiência - por favor, preencha as informações que faltam, estenda as descrições e corrija os detalhes se você puder. Atenção: trata-se do comando de comando Bash-builtin, no entanto, a descrição deve ser Quase idêntico para um comando externo que segue POSIX. GNU Awk espera uma vírgula após a string de formato e entre cada um dos argumentos de um comando printf. Para obter exemplos, consulte: snippet de código. Ao contrário de outras documentações, não quero redirecioná-lo para a página de manual para a família de funções printf (). No entanto, se você tiver mais experiência, essa deve ser a descrição mais detalhada para as cadeias e modificadores de formato. Devido a implementações históricas conflitantes do comando echo, o POSIX recomenda que o printf seja preferido em relação ao echo. O comando printf fornece um método para imprimir texto pré-formatado semelhante à interface do sistema printf () (função C). Isso significava como sucessor do eco e tem muito mais recursos e possibilidades. Além de outros motivos, o POSIX tem um argumento muito bom para recomendá-lo: Ambos os principais sabores históricos do comando de eco são mútuos exclusivos, eles colidem. Um comando quotnewquot tinha que ser inventado para resolver o problema. O formato de texto é dado em ltFORMATgt. Enquanto todos os argumentos que a sequência de formatos pode apontar são dados depois disso, aqui, indicado por ltARGUMENTSgt. Assim, um típico printf - call se parece: onde quotNome de nome: snName: snquot é a especificação do formato, e as duas variáveis ​​são passadas como argumentos, os s nos pontos de formatos para (para cada especificador de formato que você fornece, printf aguarda um argumento) . Se dado, a saída é atribuída à variável VAR em vez de impressa para stdout (comparável a sprintf () de alguma forma). A opção - v can039t atribuir diretamente a índices de matriz em versões Bash anteriores ao Bash 4.1. Em versões mais recentes do que 4.1, é preciso ter cuidado ao realizar expansões no primeiro argumento sem opção do printf, pois isso abre a possibilidade de uma vulnerabilidade de injeção de código fácil. Onde o eco pode, obviamente, ser substituído por qualquer comando arbitrário. Se for necessário, especifique uma string de formato codificado ou use - para assinalar o fim das opções. O mesmo problema exato também se aplica a leitura. E um semelhante ao mapfile. Embora realizar expansões em seus argumentos é menos comum. É claro que, em termos de shell, os argumentos são apenas cordas, no entanto, as notações C comuns mais algumas adições para constantes de números são reconhecidas para dar um número-argumento para printf. printf e número de códigos de formato scanf com até seis dígitos de precisão Notação científica: no printf (), as promoções de tipo de expressão são esperadas - em uma expressão, char e short são convertidos em int, e float é convertido em duplo. Assim, c realmente corresponde a um parâmetro de tipo int e f e g realmente correspondem a parâmetros de tipo duplo. Assim, em printf () não há diferença entre f e lf, ou entre g e lg. No entanto, em scanf () o que é passado é um ponteiro para a variável assim que não ocorrem promoções de tipo ou são esperados. Assim, f e lf são bastante diferentes no scanf, mas o mesmo no printf. Pessoalmente, eu costumava usar lg rotineiramente para duplos em printf e scanf, mas isso é fora de favor nos dias de hoje e, de fato, gcc lhe dará uma mensagem de aviso para usar lg em printf. O procedimento usual nestes dias é usar g para o dobro em printf e lg para duplo em scanf. Não importa qual você usa para printf porque a função de biblioteca printf trata-los como sinônimos, mas é crucial para obtê-lo direito para scanf. Modificadores de formato printf Os modificadores aparecem entre a letra e a letra. Um número é uma largura de campo. E um número é uma precisão Exemplo: printf (6.3f, 2.8) rende 2.800 (com um espaço antes do 2) Note que esse 6 inclui as 3 casas decimais eo 1. - 6 caracteres no total. Assim, 6-3-1 2 caracteres à esquerda do ponto decimal. 0 (o dígito zero) significa almofada com zeros para a largura do campo (usualmente usado apenas com inteiros) l (a letra) significa longo, e. Ld para formatar um int longo em decimal Exemplo de 0: 2. 3 (um espaço entre. E 3) Em 02d, o 0 não faz parte da largura do campo. É um caractere de modificador. E quando você tiver uma largura de campo, você deve gravá-la de modo que não comece com um zero (e então você pode prepender um zero como um caractere de modificador se desejar). Dados formatados por texto para stdout Grava o fio C apontado por Formato para a saída padrão (stdout). Se o formato incluir especificadores de formato (subseqüências começando com), os argumentos adicionais seguintes formato são formatados e inseridos na seqüência resultante substituindo seus respectivos especificadores. Parâmetros format C string que contém o texto a ser gravado em stdout. Ele pode opcionalmente conter especificadores de formato incorporado que são substituídos pelos valores especificados em argumentos adicionais subseqüentes e formatados conforme solicitado. Onde o caractere do especificador no final é o componente mais significativo, uma vez que define o tipo e a interpretação do seu argumento correspondente: inteiro digerido assinado inteiro decimal não assinado inteiro hexadecimal não assinado inteiro hexadecimal não assinado (maiúsculas) ponto decimal decimal, minúsculo ponto decimal decimal, Maiúsculas e minúsculas Notação científica (mantissaexponent), minúsculas Notação científica (mantissaexponent), maiúscula Use a representação mais curta: e ou f Use a representação mais curta: E ou F Ponto flutuante hexadecimal, ponto flutuante hexadecimal em minúsculas, maiúscula Cadeia de caracteres Nada impresso. O argumento correspondente deve ser um ponteiro para um int assinado. O número de caracteres escritos até agora é armazenado na localização apontada. Um seguido de outro personagem irá escrever um único no fluxo. O especificador de formato também pode conter sub-especificadores: sinalizadores. largura ..precisão e modificadores (nessa ordem), que são opcionais e seguem estas especificações: Justificação à esquerda dentro da largura do campo dado A justificação à direita é o padrão (ver sub-especificador de largura). Forças para preceder o resultado com um sinal de mais ou menos (ou -) mesmo para números positivos. Por padrão, apenas os números negativos são precedidos de um sinal. Se nenhum sinal vai ser escrito, um espaço em branco é inserido antes do valor. Usado com o. X ou X especificadores o valor é precedido com 0. 0x ou 0X respectivamente para valores diferentes de zero. Usado com a. UMA . E. E. F. F. G ou G força a saída escrita a conter um ponto decimal mesmo se não mais dígitos seguir. Por padrão, se nenhum dígito seguir, nenhum ponto decimal é gravado. Esquerda-pads o número com zeros (0) em vez de espaços quando preenchimento é especificado (ver sub-especificador de largura). Para especificadores inteiros (d. I. O. U. X. X): precisão especifica o número mínimo de dígitos a serem escritos. Se o valor a ser escrito for menor que este número, o resultado será preenchido com zeros à esquerda. O valor não é truncado, mesmo que o resultado seja maior. Uma precisão de 0 significa que nenhum caractere é escrito para o valor 0. Para um . UMA . E. E. Especificadores F e F: este é o número de dígitos a imprimir após o ponto decimal (por padrão, isto é 6). Para especificadores g e G: Este é o número máximo de dígitos significativos a serem impressos. Para s . Este é o número máximo de caracteres a serem impressos. Por padrão, todos os caracteres são impressos até que o caractere nulo final seja encontrado. Se o período for especificado sem um valor explícito para precisão. 0 é assumido. A precisão não é especificada na seqüência de caracteres de formato, mas como um argumento de valor inteiro adicional que precede o argumento que deve ser formatado. O comprimento sub-especificador modifica o comprimento do tipo de dados. Este é um gráfico que mostra os tipos usados ​​para interpretar os argumentos correspondentes com e sem especificador de comprimento (se um tipo diferente for usado, a promoção ou conversão de tipo apropriada será executada, se permitido): Nota sobre o especificador c: ele toma um int ( Ou wintt) como argumento, mas executa a conversão adequada para um valor de caracteres (ou um wchart) antes de formatá-lo para saída. Nota: As linhas amarelas indicam especificadores e sub-especificadores introduzidos por C99. Consulte ltcinttypesgt para os especificadores para tipos estendidos. . (Argumentos adicionais) Dependendo da seqüência de formato, a função pode esperar uma seqüência de argumentos adicionais, cada um contendo um valor a ser usado para substituir um especificador de formato na seqüência de formato (ou um ponteiro para um local de armazenamento, para n). Deve haver pelo menos tantos desses argumentos quanto o número de valores especificados nos especificadores de formato. Argumentos adicionais são ignorados pela função. Valor de retorno Em caso de sucesso, o número total de caracteres escritos é retornado. Se ocorrer um erro de escrita, o indicador de erro (ferror) é definido e um número negativo é retornado. Se ocorrer um erro de codificação de caracteres multibyte ao escrever caracteres largos, errno é definido como EILSEQ e um número negativo é retornado. Compatibilidade Implementações de biblioteca particulares podem suportar especificadores e sub-especificadores adicionais. Os listados aqui são suportados pelos últimos padrões C e C (ambos publicados em 2017), mas aqueles em amarelo foram introduzidos no C99 (apenas necessários para implementações C desde C11) e podem não ser suportados por bibliotecas que cumpram padrões mais antigos. Coloca a seqüência de gravação para stdout (função) scanf Leia dados formatados de stdin (função) fprintf Escreva dados formatados para transmitir (função) fwrite Escreva bloco de dados para transmitir funções (função): constantes de macro: retorna uma string formatada pelas convenções de impressão usuais Da função da biblioteca C sprintf. Veja abaixo para obter mais detalhes e veja sprintf (3) ou printf (3) em seu sistema para obter uma explicação dos princípios gerais. O Perl faz sua própria formatação sprintf: ele emula a função sprintf (3). Mas não usá-lo, exceto para números de ponto flutuante, e mesmo assim apenas modificadores padrão são permitidos. Extensões não-padrão em seu local sprintf (3), portanto, não estão disponíveis a partir do Perl. Ao contrário de printf. Sprintf não faz o que você provavelmente quer dizer quando você passa uma matriz como seu primeiro argumento. A matriz possui um contexto escalar e, ao invés de usar o 0º elemento da matriz como formato, o Perl usará a contagem de elementos na matriz como formato, o que quase nunca é útil. Perls sprintf permite as seguintes conversões universalmente conhecidas: Além disso, o Perl permite as seguintes conversões amplamente suportadas: Finalmente, para a compatibilidade para trás (e nós queremos dizer para trás), o Perl permite essas conversões desnecessárias mas amplamente suportadas: Observe que o número de Expoente na notação científica produzida por e. E. g e G para números com o módulo do expoente inferior a 100 depende do sistema: pode ser três ou menos (zero-acolchoado conforme necessário). Em outras palavras, 1.23 vezes dez para 99 pode ser 1,23 e 99 ou 1,23e099. Da mesma forma para a e A. o expoente ou os dígitos hexadecimais podem flutuar: especialmente a opção de configuração Perl de duplos longos pode causar surpresas. Entre a letra e o formato, você pode especificar vários atributos adicionais que controlam a interpretação do formato. Em ordem, estes são: um índice de parâmetro de formato explícito, como 2. Por padrão, o sprintf formatará o próximo argumento não utilizado na lista, mas isso permite que você tire os argumentos fora de ordem: quando um espaço e um sinal de mais são dados Como as bandeiras ao mesmo tempo, o espaço é ignorado. Quando a bandeira e uma precisão são dadas na conversão o, a precisão é incrementada se for necessário para o líder 0. Essa bandeira indica Perl para interpretar a seqüência fornecida como um vetor de números inteiros, um para cada caractere na seqüência de caracteres. Perl aplica o formato a cada inteiro, por sua vez, junta as seqüências resultantes com um separador (um ponto por padrão). Isso pode ser útil para exibir valores ordinais de caracteres em cadeias arbitrárias: Coloque um asterisco antes do v para substituir a seqüência de caracteres para usar para separar os números: Você também pode especificar explicitamente o número do argumento para usar para a seqüência de junção usando algo como 2v para Exemplo: os argumentos geralmente são formatados para serem tão amplos quanto necessário para exibir o valor fornecido. Você pode substituir a largura colocando um número aqui ou obter a largura do próximo argumento (com) ou de um argumento especificado (por exemplo, com 2): Se uma largura de campo obtida através é negativa, ele tem o mesmo efeito que o - Flag: justificação à esquerda. Você pode especificar uma precisão (para conversões numéricas) ou uma largura máxima (para conversões de string), especificando um. Seguido por um número. Para formatos de ponto flutuante, exceto g e G. isso especifica quantos lugares a direita do ponto decimal para mostrar (o padrão sendo 6). Por exemplo: Para g e G, isso especifica o número máximo de dígitos a serem exibidos, incluindo os anteriores ao ponto decimal e aqueles depois dele por exemplo: Para conversões de números inteiros, especificar uma precisão implica que a saída do próprio número deve ser zero - padded a essa largura, onde o sinalizador 0 é ignorado: Para conversões de seqüência de caracteres, especificando uma precisão trunca a seqüência de caracteres para ajustar a largura especificada: Você também pode obter a precisão do próximo argumento usando .. ou a partir de um argumento especificado .2): Se uma precisão obtida através é negativa, ela não tem nenhuma precisão. Para conversões numéricas, você pode especificar o tamanho para interpretar o número como usando l. H. V. q. L. ou ll. Para conversões inteiras (duox X bi DUO), os números geralmente são assumidos como sendo qualquer que seja o tamanho inteiro padrão na sua plataforma (geralmente 32 ou 64 bits), mas você pode substituir isso para usar em vez disso um dos tipos C padrão, como suportado Pelo compilador usado para criar o Perl: a partir de 5.14, nenhum desses levanta uma exceção se eles não forem suportados em sua plataforma. No entanto, se os avisos estiverem ativados, um aviso da classe de aviso printf é emitido em um sinalizador de conversão não suportado. Em vez disso, você prefere uma exceção, faça isso: se você gostaria de saber sobre uma dependência de versão antes de começar a executar o programa, coloque algo como este no topo: Você pode descobrir se o seu Perl é compatível com quads via Config: Conversões de pontos (efg EFG), os números geralmente são assumidos como o tamanho de ponto flutuante padrão em sua plataforma (dupla ou dupla longa), mas você pode forçar o duplo longo com q. L. ou ll se sua plataforma os suportar. Você pode descobrir se o seu Perl suporta duplicações longas via Config: Você pode descobrir se Perl considera longo duplo para ser o tamanho de ponto flutuante padrão para usar em sua plataforma via Config: Também pode ser que duplos e duplos são os mesmos Coisa: O especificador de tamanho V não tem efeito para código Perl, mas é compatível com compatibilidade com código XS. Significa usar o tamanho padrão para um número Inteiro Perl ou flutuante, o que é o padrão. Normalmente, sprintf toma o próximo argumento não utilizado como o valor para formatar para cada especificação de formato. Se a especificação de formato usa para exigir argumentos adicionais, eles são consumidos da lista de argumentos na ordem em que aparecem na especificação de formato antes do valor para formatar. Quando um argumento é especificado por um índice explícito, isso não afeta a ordem normal dos argumentos, mesmo quando o índice explicitamente especificado teria sido o próximo argumento. Usa a para a largura, b para a precisão e c como o valor para formatar enquanto: usaria um para a largura e precisão e b como o valor para formatar. Aqui estão alguns outros exemplos, esteja ciente de que, ao usar um índice explícito, talvez seja necessário escapar: se a localidade de uso (incluindo locale 39: notcharacters39) estiver em vigor e POSIX :: setlocale foi chamado, o caractere usado para o separador decimal em Os números de ponto flutuante formatados são afetados pelo local LCNUMERIC. Veja Perllocale e POSIX.

No comments:

Post a Comment