Imprimir dados formatados para stdout Grava a cadeia C apontada 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 2011), 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. Escreve string para stdout (função) scanf Ler dados formatados de stdin (função) fprintf Escrever dados formatados para fluxo (função) fwrite Escrever bloco de dados para fluxo (função) funções: macro constantes: Não existe um especificador de conversão binário na glibc normalmente . É possível adicionar tipos de conversão personalizados à família de funções printf () no glibc. Veja registerprintffunction para obter detalhes. Você pode adicionar uma conversão b personalizada para seu próprio uso, se simplificar o código do aplicativo para disponibilizá-lo. Aqui está um exemplo de como implementar formatos de impressão personalizados no glibc. Além disso, o que você está falando sobre w. r.t. Manejar múltiplos resultados sequencialmente não é reentrada por si só, mas sim simplesmente a queda do uso do que equivale a um objeto global para armazenar o resultado. A função não está sendo reentrada. Em C, o idioma apropriado, ou pelo menos amplamente usado, para lidar com funções que armazenam seus resultados em um objeto global é copiar esses resultados imediatamente após a obtenção deles. Isso tem a principal vantagem de que, se apenas um resultado for exigido de cada vez, nenhuma alocação adicional será necessária. Ndash Greg A. Woods 27 nov 12 às 0:51 Aqui vamos ter que discordar. Eu não posso ver como a adição de um símbolo de pré-processador discreto vem em qualquer lugar perto da nocividade de limitar os casos de uso severamente, tornando a interface propensa a erros, reservando armazenamento permanente para a duração do programa por um valor temporário e gerando código pior na maioria das plataformas modernas . Ndash R .. Nov 27 12 at 1:53 A família printf () só pode imprimir nas bases 8, 10 e 16 usando os especificadores padrão diretamente. Sugerir criação de uma função que converte o número para uma string por necessidades específicas de códigos. Todas as outras respostas até agora têm pelo menos uma dessas limitações. Use a memória estática para o buffer de retorno. Isso limita o número de vezes que a função pode ser usada como argumento para printf (). Alocar memória que exija o código de chamada para ponteiros livres. Exigir o código de chamada para fornecer explicitamente um buffer adequado. Ligue printf () diretamente. Isso obriga uma nova função para fprintf (). Sprintf (). Vsprintf (). Etc. Use um intervalo reduzido de números inteiros. O seguinte não possui nenhuma limitação acima. Requer C99 ou posterior e uso de s. Ele usa um composto literal para fornecer o espaço do buffer. Não tem problemas com várias chamadas em um printf ().Printf Format Strings Por Alex Allain Por padrão, C fornece uma grande quantidade de energia para a formatação de saída. A função de exibição padrão, printf, leva uma string de formato que permite especificar muitas informações sobre como um programa é formatado. Nota: se você estiver procurando por informações sobre a saída de formatação em C, dê uma olhada na formatação da saída C usando iomanip. Vamos olhar a anatomia de uma sequência de formatos seguida de alguns exemplos de programas curtos para mostrar as diferentes configurações em ação. Eu não vou incluir todas as opções possíveis - em vez disso, o meu objetivo é fazer com que seja fácil de entender o mini-idioma que você pode usar para criar strings de formato e ensinar-lhe como usar a formatação comum youre mais provável de precisar. Anatomia de um String de Formato Quando você faz uma chamada para printf, a idéia básica é que você vai fornecer uma seqüência de caracteres que tem alguns caracteres literais e alguns elementos que devem ser substituídos. Por exemplo, uma string como: Será impressa literalmente como aparece. Embora às vezes seja suficiente literalmente escrever em seu código exatamente o que você deseja imprimir, você geralmente quer fazer algo mais sofisticado - introduzindo caracteres especiais usando seqüências de escape ou introduzindo valores de variáveis usando especificadores de formato. Sequências de escape Existem alguns caracteres que você não pode entrar diretamente em uma string. Estes são personagens como uma nova linha, que deve ser representada usando alguma sintaxe especial. Estas são chamadas de seqüências de escape e se parecem com isto: Aqui, entrei nas novas linhas entre cada letra, a, b e c. Cada sequência de escape começa com um caractere de barra invertida (). As principais seqüências de escape que você usará são: n, colocar uma nova linha e t para inserir uma guia. Uma vez que uma barra invertida normalmente indica o início de uma seqüência de escape, se você quiser colocar uma seqüência de escape que você precisa usar para exibir uma barra invertida: é como você escrever um caminho do Windows em C. Theres um outro truque avançado, que é que você Pode escrever ltnumgt para exibir o caractere ASCII representado pelo valor num. Isso é útil se você deseja exibir um caractere que você não pode digitar com facilidade em seu teclado, como letras acentuadas. Por exemplo, 130 irá imprimir um caractere (em alguns casos, dependendo do que a máquina está configurada para fazer com caracteres ASCII estendidos.) Format Specifiers Se você quiser introduzir alguma variação na saída, faça isso indicando que o São necessários dados: nessa cadeia, o d indica que o valor a ser exibido nesse ponto na seqüência precisa ser retirado de uma variável. O sinal indica que estamos juntando alguns dados na seqüência de caracteres e o caractere d indica que estamos empilhando num número decimal. A parte da seqüência de caracteres que começa com é chamada de especificador de formato. A fim de realmente obter esse número, precisamos fornecer esse valor para printf: que irá exibir: Toda a formatação interessante que você pode fazer envolve a alteração dos valores que você colocar após o sinal, que é o formato real. O formato para o que aparece sobre um sinal é: A maioria desses campos são opcionais, além de fornecer um especificador de conversão, que você já viu (por exemplo, usando d para imprimir um número decimal). Entender esta formatação é melhor feito trabalhando para trás, começando com o especificador de conversão e trabalhando para fora. Então vamos começar no final Especificador de conversão O especificador de conversão é a parte do especificador de formato que determina a formatação básica do valor a ser impresso. Especificadores de conversão para números inteiros Se você deseja imprimir um número inteiro decimal na base 0, você usará d ou i. D ou eu. Se você quiser imprimir um número inteiro em octal ou hexadecimal, use o para octal ou x para hexadecimal. Se você quiser letras maiúsculas (A em vez de um ao imprimir decimal 10), então você pode usar X. Especificadores de conversão para números de ponto flutuante Exibindo números de ponto flutuante tem uma tonelada de opções diferentes, melhor mostrado em uma tabela: Ok, isso não era tão ruim assim. Mas esse gráfico é um pouco complicado. Minha recomendação: basta usar g, e geralmente fará o que você quer: Onde a notação científica é mais apropriada. Exibição de um sinal de porcentagem Como o sinal de porcentagem é usado para definir especificadores de formato, existe um especificador de formato especial que significa imprimir o sinal de porcentagem: simplesmente imprimir um sinal de porcentagem. Agora, vamos percorrer cada um dos diferentes componentes de um especificador de formato. Comprimento Modificador O modificador de comprimento talvez seja estranhamente nomeado, não modifica o comprimento da saída. Em vez disso, é o que você usa para especificar o comprimento da entrada. Huh Diga que você tem: Aqui, d é a entrada para printf e o que você está dizendo é que você deseja imprimir d como um duplo, mas d não é um duplo, é um duplo longo. Um duplo longo é provável que seja 16 bytes (em comparação com 8 para um duplo), então a diferença importa. Tente executar esse pequeno snippet e descobrirá que obtém uma saída de lixo semelhante a esta: Lembre-se, os bytes que são dados para printf estão sendo tratados como um duplo - mas eles não são um duplo, theyre um longo duplo. O comprimento é errado, e os resultados são feios. O modificador de comprimento é tudo sobre ajudar o PrintF a lidar com casos em que você está usando variáveis invulgarmente grandes (ou invulgarmente pequenas). A melhor maneira de pensar sobre os modificadores de comprimento é dizer: que tipo de variável eu tenho, e eu preciso usar um modificador de comprimento para ele Heres uma tabela que deve ajudá-lo: long double d 3.1415926535 printf (Lg, d) Id Gostaria de fazer uma menção especial sobre o amplo tratamento de caracteres. Se você escrever sem o l, o resultado será imprimir uma única W na tela. A razão é que caracteres largos são dois bytes, e para caracteres ASCII simples como W, o segundo byte é 0. Portanto, printf acha que a seqüência de caracteres está concluída Você deve dizer printf para procurar caracteres multibyte adicionando o l: ls. (Se você estiver usando wprintf, por outro lado, você pode simplesmente usar s e ele tratará nativamente todas as strings como strings de caracteres largos.) O modificador de precisão é escrito. number, e tem significados ligeiramente diferentes para os diferentes especificadores de conversão (Como d ou g). Para números de ponto flutuante (por exemplo, f), ele controla o número de dígitos impressos após o ponto decimal: se o número fornecido tiver mais precisão do que o dado, ele irá rodar. Por exemplo: exibirá como interessante, para g e G, ele controlará o número de figuras significativas exibidas. Isso afetará não apenas o valor após a casa decimal, mas o número inteiro. Para números inteiros, por outro lado, a precisão que controla o número mínimo de dígitos impressos: Will imprimir o número 10 com três dígitos: Theres um caso especial para inteiros - se você especificar .0, então o número zero não terá nenhuma saída : Finalmente, para cordas, a precisão controla o comprimento máximo da seqüência exibida: Isso é útil se você precisa se certificar de que sua saída não excede um número fixo de caracteres. O campo de largura é quase o oposto do campo de precisão. A precisão controla o número máximo de caracteres para imprimir, a largura controla o número mínimo e possui o mesmo formato que a precisão, exceto sem um ponto decimal: os espaços em branco vão no início, por padrão. Você pode combinar a precisão e a largura, se desejar: ltwidthgt. ltprecisiongt (Observe o espaço inicial.) A configuração de sinalizador controla os caracteres que são adicionados a uma seqüência de caracteres, como se anexar 0x a um número hexadecimal ou se os números de pad com 0s. As opções de sinalizador específicas são O sinal de libra: adicionar um fará com que um 0 seja precedido de um número octal (ao usar o especificador de conversão) ou um 0x a ser anexado a um número hexadecimal (ao usar um x especificador de conversão). Para a maioria dos outros especificadores de conversão, adicionar uma vontade simplesmente forçará a inclusão de um ponto decimal, mesmo que o número não tenha parte fracionada. Sendo impresso. Considerando que os resultados em simplesmente O Zero Flag: 0 Usando 0 forçará o número a ser preenchido com 0s. Isso realmente importa se você usar a configuração de largura para pedir uma largura mínima para o seu número. Por exemplo, se você escrever: O sinal de sinal mais: O sinal de mais incluirá o especificador de sinal para o número: O sinalizador sinal de menos: - Finalmente, o sinal de menos fará com que a saída seja justificada à esquerda. Isso é importante se você estiver usando o especificador de largura e deseja que o preenchimento apareça no final da saída em vez do início: Com o preenchimento no final da saída. Combinando tudo isso. Para qualquer especificador de formato determinado, você pode fornecer sempre deve fornecer o sinal de porcentagem eo especificador de base. Você pode então incluir qualquer, ou todas, as bandeiras, largura e precisão e comprimento que você deseja. Você pode até incluir várias bandeiras em conjunto. Heres um exemplo particularmente complexo demonstrando múltiplos sinalizadores que seria útil para imprimir endereços de memória como valores hexadecimais. A maneira mais fácil de ler isso é primeiro aviso o sinal e, em seguida, ler direito à esquerda - o x indica que estamos a imprimir um valor hexadecimal o 10 indica que queremos 10 total de caracteres de largura o próximo 0 é uma bandeira indicando que queremos Para pad com 0s intead de espaços e, finalmente, o sinal indica que queremos um 0x líder. Desde que começamos com 0x, isso significa que temos 8 dígitos - exatamente a quantidade certa para imprimir um endereço de memória de 32 bits. O resultado final é: Leia mais artigos similares eu preciso processar este personagem como um número binário para estabelecer se durante o processo de transmissão os dados tem corrupted. quot Im não tenho certeza que eu entendo. Parece que neste caso você não precisa exibir esse UCHAR como binário ou hexadecimal, mas apenas para fazer alguma operação lógica bitwise e mudanças naquele UCHAR. Algo como contar o número de 1 bits de que uchar por exemplo: unsigned char c 93 int bitcount 0 printf (quotbitcount: dnquot, bitcount) Sábado, 09 de dezembro de 2006 21:11 Isso é exatamente o que eu estava procurando (um carry ). Mas com alguns ajustes para o pedaço de código que você me deu eu consigo fazer isso unsigned char c 93 printf (ctxnn, c, c) if (c amp 128) Dj1 para (j0jlt8j) printf (d, Dj) Domingo, Dezembro 10, 2006 2:20 PM Todas as respostas Para o formato hexadecimal printf tem o especificador de formato x que faz isso. Para binário você pode usar a função itoa: unsigned char ch 934 algum valor de char não assinado aleatório para exibir char text16 buffer para usar com itoa printf (quotxnquot. Ch) hex usando x formato especificador itoa (ch, text, 16) hex usando itoa com base 16 printf (texto quotsnquot.) Itoa (ch, text, 2) usando itoa com base 2 printf (quotsnquot, text) Sábado, 09 de Dezembro de 2006 19:49 Obrigado pela rápida resposta Este pedaço de código funciona em circunstâncias normais Mas no meu caso particular o UCHAR é parte de uma mensagem entregue por um UART, ao qual um fluxo de dados é anexado. Assim, eu preciso processar este caractere como um número binário para estabelecer se durante o processo de transmissão os dados tem corrompido. Eu preciso processar este personagem como um número binário para estabelecer se durante o processo de transmissão os dados tem corrompido. quot Im não tenho certeza que eu entendo. Parece que neste caso você não precisa exibir esse UCHAR como binário ou hexadecimal, mas apenas para fazer alguma operação lógica bitwise e mudanças naquele UCHAR. Algo como contar o número de 1 bits de que uchar por exemplo: unsigned char c 93 int bitcount 0 printf (quotbitcount: dnquot, bitcount) sábado, 09 de dezembro de 2006 9:11 PM Eu poderia recuperar bit by bit, deslocando para a direita (Gtgt) ou à esquerda (ltlt) Ie Cf 66 - 01010101 Onde o último bit foi. Domingo, 10 de dezembro de 2006 10:02 Não, você não pode. Você precisa testar o primeiro bit, mudar, testar novamente e assim por diante. Em linguagem de montagem o bit que sai geralmente pode ser encontrado em algo chamado quotcarry flagquot e ele pode ser testado lá, mas CC não tem tal coisa. Domingo, 10 de dezembro de 2006 1:18 PM Isso é exatamente o que eu estava procurando (um carry). Mas com alguns ajustes para o pedaço de código que você me deu eu consigo fazer isso unsigned char c 93 printf (ctxnn, c, c) if (c amp 128) Dj1 para (j0jlt8j) printf (d, Dj) Domingo, Dezembro 10, 2006 2:20 PM Isto não olha direito a mim. Quarta-feira, 07 de novembro de 2007 17:25 Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site Msdn. Você gostaria de participar
No comments:
Post a Comment