O comando printf Stranger, 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 puder. Atenção: Trata-se do comando print - mas a descrição deve ser Quase idêntico para um comando externo que segue POSIX. GNU Awk espera uma vírgula após a seqüência de caracteres 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, eu não quero redirecioná-lo para a página de manual para a família de funções printf () C. No entanto, se you039re mais experientes, que deve ser a descrição mais detalhada para o formato seqüências de caracteres e modificadores. Devido a implementações históricas conflitantes do comando echo, o POSIX recomenda que o printf seja preferido ao echo. Geral O comando printf fornece um método para imprimir texto pré-formatado semelhante à interface do sistema printf () (função C). It039s significou como sucessor de eco e tem muito mais recursos e possibilidades. Além de outras razões, POSIX tem um argumento muito bom para recomendá-lo: Ambos os principais sabores históricos do comando echo são exclusivos mútuos, eles colidem. Um comando quotnewquot tinha que ser inventado para resolver o problema. Sintaxe O formato de texto é fornecido em ltFORMATgt. Enquanto todos os argumentos que o formatstring pode apontar são dados depois disso, aqui, indicado por ltARGUMENTSgt. Assim, um típico printf - call se parece com: onde quotSome: snName: snquot é a especificação de formato e as duas variáveis são passadas como argumentos, o s nos formatostring aponta para (para cada especificador de formato que você dá, printf aguarda um argumento) . Opções Se for dada, 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 não pode atribuir diretamente aos índices de matriz em versões do Bash anteriores ao Bash 4.1. Em versões mais recentes do que 4.1, deve-se ter cuidado ao executar expansões no primeiro argumento não-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 seqüência de caracteres de codificação rígida 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. Argumentos Claro que no shell, o que significa que os argumentos são apenas seqüências de caracteres, no entanto, as notações comuns C mais algumas adições para as constantes de número são reconhecidos para dar um número de argumento para printf. Formatting Numérico Print Output Mais cedo você viu o uso da impressão E métodos println para imprimir seqüências de caracteres para saída padrão (System. out). Como todos os números podem ser convertidos em strings (como você verá mais adiante nesta lição), você pode usar esses métodos para imprimir uma mistura arbitrária de strings e números. A linguagem de programação Java tem outros métodos, entretanto, que permitem que você exerça muito mais controle sobre sua saída de impressão quando os números são incluídos. Os métodos printf e format O pacote java. io inclui uma classe PrintStream que possui dois métodos de formatação que você pode usar para substituir print e println. Estes métodos, formato e printf. São equivalentes entre si. O System. out familiar que você está usando acontece para ser um objeto PrintStream, para que você possa invocar métodos PrintStream em System. out. Assim, você pode usar formato ou printf em qualquer lugar em seu código onde você já estava usando print ou println. Por exemplo, a sintaxe para esses dois métodos java. io. PrintStream é a mesma: onde format é uma string que especifica a formatação a ser usada e args é uma lista das variáveis a serem impressas usando essa formatação. Um exemplo simples seria O primeiro parâmetro, formato. É uma string de formato especificando como os objetos no segundo parâmetro, args. Devem ser formatados. A seqüência de caracteres formato contém texto sem formatação, bem como especificadores de formato. Que são caracteres especiais que formatam os argumentos de Object. Args. (A notação Object. Args é chamada varargs., O que significa que o número de argumentos pode variar.) Especificadores de formato começam com um sinal de porcentagem () e terminam com um conversor. O conversor é um caractere que indica o tipo de argumento a ser formatado. Entre o sinal de porcentagem () eo conversor você pode ter sinalizadores e especificadores opcionais. Há muitos conversores, sinalizadores e especificadores, que estão documentados em java. util. Formatter Aqui está um exemplo básico: O d especifica que a única variável é um inteiro decimal. O n é um personagem de nova linha independente da plataforma. A saída é: Os métodos printf e format estão sobrecarregados. Cada um tem uma versão com a seguinte sintaxe: Para imprimir números no sistema francês (onde uma vírgula é usada no lugar da casa decimal na representação em inglês de números de ponto flutuante), por exemplo, você usaria: Um exemplo A tabela a seguir Lista alguns dos conversores e sinalizadores que são usados no programa de exemplo, TestFormat. java. Que segue a tabela. Conversores e Sinalizadores Usados em TestFormat. java Dez caracteres de largura, justificados à direita, com três lugares após o ponto decimal. O seguinte programa mostra alguns da formatação que você pode fazer com formato. A saída é mostrada entre aspas duplas no comentário incorporado: Nota: A discussão nesta seção abrange apenas os conceitos básicos do formato e métodos printf. Mais detalhes podem ser encontrados na seção E / S Básica do caminho Essencial, na página Formatação. Usar String. format para criar seqüências de caracteres é coberto em Strings. A classe DecimalFormat Você pode usar a classe java. text. DecimalFormat para controlar a exibição de zeros, prefixos e sufixos iniciais e posteriores, agrupamento (milhares) de separadores eo separador decimal. DecimalFormat oferece uma grande flexibilidade na formatação de números, mas pode tornar seu código mais complexo. O exemplo a seguir cria um objeto DecimalFormat, myFormatter. Passando uma seqüência de padrão para o DecimalFormat construtor. O método format (), que DecimalFormat herda de NumberFormat. É então invocado pelo myFormatter 151it aceita um valor duplo como um argumento e retorna o número formatado em uma string: Aqui está um programa de exemplo que ilustra o uso de DecimalFormat: A tabela a seguir explica cada linha de output. Basics de Formatted Input / Output in Conceitos C E / S é essencialmente feito um caractere (ou byte) em um fluxo de tempo - uma seqüência de caracteres que flui de um lugar para outro fluxo de entrada. Os fluxos de dados do dispositivo de entrada (teclado, arquivo, etc) em fluxo de saída de memória. Fluxos de dados da memória para o dispositivo de saída (monitor, arquivo, impressora, etc.) Fluxos de E / S padrão (com significado interno) stdin. Fluxo de entrada padrão (padrão é o teclado) stdout. Fluxo de saída padrão (padrão para monitorar) stderr. Fluxo de erro padrão stdio. h - contém funções de E / S básicas scanf. Lê a entrada padrão (stdin) printf. Escreve para a saída padrão (stdout) Existem outras funções semelhantes a printf e scanf que gravam e lêem de outros fluxos Como incluir, para C ou C compilador E / S formatada - refere-se à conversão de dados para e de um fluxo De caracteres, para impressão (ou leitura) em formato de texto simples Todos os E / S de texto que fazemos é considerado E / S formatada A outra opção é ler / escrever informações binárias diretas (comuns com E / S de arquivo, por exemplo) Saída com printf Recap O formato básico de uma chamada de função printf é: onde: formatstring é o layout do que está sendo impresso listofexpressions é uma lista separada por vírgulas de variáveis ou expressões produzindo resultados a serem inseridos na saída Para produzir literais de seqüência, basta usar um parâmetro em Printf. A seqüência de caracteres em si Especificadores de conversão Um especificador de conversão é um símbolo que é usado como um espaço reservado em uma seqüência de caracteres de formatação. Para saída inteira (por exemplo), d é o especificador que contém o lugar para inteiros. Aqui estão alguns especificadores de conversão comumente usados (não uma lista abrangente): Impressão de inteiros Para produzir um inteiro, use d na seqüência de caracteres de formato e uma expressão de inteiro no listofexpressions. Podemos especificar o campo wicth (ou seja, quantos espaços o item imprime). Padrão para justificação à direita. Coloque um número entre o e o d. Neste exemplo, a largura do campo é 10: Para justificar à esquerda, use um número negativo na largura do campo: Se a largura do campo for muito pequena ou não especificada, o padrão será o número mínimo de caracteres necessários para imprimir o item: Especificando o campo A largura é mais útil quando se imprime várias linhas de saída que se destinam a alinhar em um formato de tabela Impressão Números de ponto flutuante Use o modificador f para imprimir valores de ponto flutuante em notação fixa: Use e para notação exponencial: Observe que o e02 significa tempos 10 para a segunda potência Você também pode controlar a precisão decimal, que é o número de lugares após o decimal. A saída será arredondada para o número apropriado de casas decimais, se necessário: A largura do campo também pode ser controlada, como com números inteiros: No especificador de conversão, o número antes do decimal é largura do campo e o número depois é a precisão. (Neste exemplo, 9 e 2). -9.2 seria justificado à esquerda em uma largura de campo de 9, como com inteiros caracteres de impressão e seqüências de caracteres Use o especificador de formatação c para caracteres. O tamanho do campo padrão é 1 caractere: Use s para imprimir strings. As larguras de campo funcionam exatamente como com inteiros: output. c - contém todas as saídas de amostra acima. Tente executá-lo você mesmo scanf Noções básicas Para ler dados de entrada padrão (teclado), chamamos a função scanf. A forma básica de uma chamada para scanf é: A string de formato é como a de printf Mas em vez de expressões, precisamos de espaço para armazenar dados de entrada, daí a lista de endereços de variáveis Se x é uma variável, então a expressão x significa endereço de X scanf exemplo: Especificadores de conversão Principalmente o mesmo que para a saída. Algumas pequenas diferenças Use f para o tipo float. Mas use lf para tipos duplos e longos duplos O tipo de dados lido, o especificador de conversão ea variável usada precisam corresponder no tipo O espaço em branco é ignorado por padrão em leituras numéricas consecutivas. Mas não é ignorado para entradas de caracteres / string. Exemplo Exemplo de execução 1 Entrada de usuário sublinhada, para distingui-la da saída do programa Exemplo de execução 2 Observe que nesta execução de amostra, o caractere que foi lido NÃO era a letra N. Era o espaço. (Lembre-se, espaço em branco não pulado no personagem lê). Isso pode ser contabilizado. Considere se a linha scanf era assim: Existe um espaço entre f e c na cadeia de formato. Isso permite que o usuário digite um espaço. Suponha que esta seja a entrada digitada: Em seguida, a variável de caractere c conterá agora o N. input2.c - uma versão do exemplo com essa alteração está vinculada aqui Entrada Interativa Você pode tornar a entrada mais interativa, alertando o usuário com mais cuidado. Isso pode ser tedioso em alguns lugares, mas em muitas ocasiões, torna os programas mais user-friendly. Exemplo: Uma boa maneira de aprender mais sobre scanf é tentar várias entradas em várias combinações e digitar em casos de teste - veja o que acontece printf / scanf com C-strings Uma seqüência de caracteres C inteira pode ser facilmente impressa, Juntamente com o nome da matriz char armazenar a seqüência de caracteres (como o argumento preencher essa posição): Tenha cuidado para usar somente isso em char arrays que estão sendo usados como seqüências de estilo C. (Isso significa, somente se o caractere nulo estiver presente como um terminador). Da mesma forma, você pode ler uma string em uma matriz char com scanf. A seguinte chamada permite a entrada de uma palavra (até 19 caracteres e um carácter nulo de terminação) a partir do teclado, que é armazenado na matriz palavra1: Os caracteres são lidos a partir do teclado até o primeiro espaço em branco (espaço, tabulação, nova linha) É encontrado. A entrada é armazenada na matriz de caracteres e o caractere nulo é anexado automaticamente. Observe também que o não era necessário na chamada scanf (word1 foi usado, em vez de word1). Isso ocorre porque o nome da matriz por si só (sem índice) é realmente uma variável que armazena um endereço (um ponteiro). Não há um especificador de conversão binário no glibc normalmente. É possível adicionar tipos de conversão personalizados à família de funções printf () da glibc. Consulte registerprintffunction para obter detalhes. Você poderia adicionar uma conversão b personalizada para seu próprio uso, se simplificar o código do aplicativo para tê-lo disponível. Aqui está um exemplo de como implementar um formato printf personalizado na glibc. Além disso, o que você está falando sobre w. r.t. A manipulação de resultados múltiplos de forma seqüencial não é a reentrada por si só, mas sim simplesmente a consequência de usar o 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 utilizado, para lidar com funções que armazenam seus resultados em um objeto global é copiar esses resultados imediatamente após obtê-los. Isto tem a grande vantagem de que, se apenas um resultado for necessário num momento, então nenhuma alocação adicional é necessária. Ndash Greg A. Woods Nov 27 12 em 0:51 Aqui we39re que vai ter que discordar. Não vejo como a adição de um símbolo de pré-processador discreto chega 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ó é capaz de imprimir na base 8, 10 e 16 usando os especificadores padrão diretamente. Sugerir a criação de uma função que converta o número em uma string por códigos de necessidades específicas. Todas as outras respostas até agora têm pelo menos uma dessas limitações. Use memória estática para o buffer de retorno. Isso limita o número de vezes que a função pode ser usada como um argumento para printf (). Alocar memória que requer o código de chamada para livre ponteiros. Exigir que o código de chamada forneça explicitamente um buffer adequado. Chame printf () diretamente. Isso obriga uma nova função para fprintf (). Sprintf (). Vsprintf (). Etc Use um intervalo reduzido de inteiros. O seguinte não tem nenhuma das limitações acima. Ele requer C99 ou posterior e uso de s. Ele usa um literal composto para fornecer o espaço de buffer. Não tem nenhum problema com chamadas múltiplas em um printf ().quot Eu preciso de processar este caráter como um número binário para estabelecer se durante o processo da transmissão os dados começ corrompidos. Eu não sou certo que eu compreendo. 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 desse 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 fazê-lo unsigned char c 93 printf (ctxnn, c, c) se (c amp 128) Dj1 para (j0jlt8j) printf (d, Dj) domingo, dezembro 10, 2006 2:20 PM Todas as respostas Para 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 o especificador de formato x itoa (ch, text, 16 ) // hex usando itoa com base 16 printf (texto quotsnquot.) Itoa (ch, text, 2) // usando itoa com base 2 printf (quotsnquot, texto) Sábado, 09 de Dezembro de 2006 19:49 Obrigado pela Resposta rápida Este pedaço de código funciona em circunstâncias normais, mas no meu caso particular, o UCHAR faz 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 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 9:11 PM Eu poderia recuperar bit by bit, deslocando para a direita (Gtgt) ou para a 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 assembly, o bit que sai geralmente pode ser encontrado em algo chamado quotcarry flagquot e ele pode ser testado lá, mas C / C 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 fazê-lo unsigned char c 93 printf (ctxnn, c, c) se (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 da Msdn. Se você optar por participar, o questionário on-line será apresentado a você quando você deixar o site Msdn. Você gostaria de participar
Comments
Post a Comment