Monday 20 November 2017

C Format Specifiers Binary Options


Noções Básicas de Entrada / Saída Formatada em Conceitos C A E / S é essencialmente feita com 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 problemas com várias chamadas em um printf ().printf Imprimir dados formatados para stdout Grava a seqüência 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 caracter especificador no final é o componente mais significativo, uma vez que define o tipo ea interpretação de seu argumento correspondente: Número decimal assinado Número inteiro decimal não assinado Inteiro hexadecimal não assinado Inteiro hexadecimal não assinado (maiúscula) Decimal ponto flutuante, minúsculas Decimal ponto flutuante, Maiúscula Notação científica (mantissa / expoente), minúsculas Notação científica (mantissa / exponente), maiúscula Use a representação mais curta: e ou f Use a representação mais curta: E ou F Ponto flutuante hexadecimal, minúscula Ponto flutuante hexadecimal, . O argumento correspondente deve ser um ponteiro para um int assinado. O número de caracteres escritos até agora é armazenado no local apontado. A seguido por outro personagem irá escrever um único para o fluxo. O especificador de formato também pode conter sub-especificadores: flags. 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 -. Se nenhum sinal vai ser escrito, um espaço em branco é inserido antes do valor. Usado com o. X ou X 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 de números inteiros (d, i, u, x, X): precision especifica o número mínimo de dígitos a serem gravados. 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 se o resultado for mais longo. Uma precisão de 0 significa que nenhum caractere é escrito para o valor 0. Para um . UMA . E. E. F e especificadores F: este é o número de dígitos a serem impressos após o ponto decimal (por padrão, este é 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 é especificado sem um valor explícito de 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 sub-especificador de comprimento modifica o comprimento do tipo de dados. Este é um gráfico mostrando os tipos usados ​​para interpretar os argumentos correspondentes com e sem especificador de comprimento (se um tipo diferente é usado, a promoção de tipo apropriado ou conversão é realizada, se permitido): Nota sobre o especificador c: leva um int ( Ou wintt) como argumento, mas executa a conversão adequada para um valor char (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 caracteres de formato, a função pode esperar uma seqüência de argumentos adicionais, cada um contendo um valor para ser usado para substituir um especificador de formato na seqüência de caracteres 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 de exemplo Implementações de biblioteca particulares podem suportar especificadores e sub-especificadores adicionais. Os listados aqui são suportados pelos mais recentes padrões C e C (ambos publicados em 2011), mas aqueles em amarelo foram introduzidos em C99 (apenas necessário para implementações C desde C11) e podem não ser suportados por bibliotecas que cumprem padrões mais antigos. Ver também puts Escrever string para stdout (função) scanf Ler dados formatados a partir de stdin (função) fprintf Gravar dados formatados para fluxo (função) fwrite Escrever bloco de dados para fluxo (função) funções: objects: types: macro constantes: fprintf Write formatted Data to stream Grava a seqüência C apontada por format para o fluxo. 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. Após o parâmetro format, a função espera pelo menos tantos argumentos adicionais como especificado pelo formato. Parâmetros stream Ponteiro para um objeto FILE que identifica um fluxo de saída. Format C string que contém o texto a ser gravado no fluxo. 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. Um especificador de formato segue este protótipo: Onde o caracter especificador no final é o componente mais significativo, uma vez que define o tipo ea interpretação de seu argumento correspondente: Inteiro decimal assinado Inteiro decimal não assinado Inteiro hexadecimal não assinado Inteiro hexadecimal não assinado (maiúsculas) Decimal flutuante Use a representação mais curta: e ou f Use a representação mais curta: E ou F Ponto flutuante hexadecimal, minúsculas Ponto flutuante hexadecimal (minúsculas) Ponto de flutuação decimal, maiúscula Ponto flutuante decimal, maiúscula Notação científica (mantissa / expoente) , 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 no local apontado. A seguido por outro personagem irá escrever um único para o fluxo. O especificador de formato também pode conter sub-especificadores: flags. 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 -. Se nenhum sinal vai ser escrito, um espaço em branco é inserido antes do valor. Usado com o. X ou X 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 de números inteiros (d, i, u, x, X): precision especifica o número mínimo de dígitos a serem gravados. 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 se o resultado for mais longo. Uma precisão de 0 significa que nenhum caractere é escrito para o valor 0. Para um . UMA . E. E. F e especificadores F: este é o número de dígitos a serem impressos após o ponto decimal (por padrão, este é 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 é 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 sub-especificador de comprimento modifica o comprimento do tipo de dados. Este é um gráfico mostrando os tipos usados ​​para interpretar os argumentos correspondentes com e sem especificador de comprimento (se um tipo diferente é usado, a promoção de tipo apropriado ou conversão é realizada, se permitido): Observe que o especificador c toma um int (ou wintt ) Como argumento, mas executa a conversão adequada para um valor char (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 caracteres de formato, a função pode esperar uma seqüência de argumentos adicionais, cada um contendo um valor para ser usado para substituir um especificador de formato na seqüência de caracteres 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. Exemplo Este exemplo solicita 3 vezes o usuário para um nome e, em seguida, escreve-los para myfile. txt cada um em uma linha com um comprimento fixo (um total de 19 caracteres newline). São utilizadas duas etiquetas de formato: d. Número inteiro decimal assinado -10.10s. Justificado à esquerda (-), mínimo de dez caracteres (10), máximo de dez caracteres (.10), string (s). Supondo que entramos em João. Jean-Francois e Yoko como os 3 nomes, myfile. txt conteria: Compatibilidade implementações de biblioteca particular pode suportar especificadores adicionais e sub-especificadores. Os listados aqui são suportados pelos mais recentes padrões C e C (ambos publicados em 2011), mas aqueles em amarelo foram introduzidos em C99 (apenas necessário para implementações C desde C11) e podem não ser suportados por bibliotecas que cumprem padrões mais antigos. Consulte também printf Imprimir dados formatados para stdout (função) fscanf Ler dados formatados de stream (função) fwrite Escrever bloco de dados para stream (função) fputs Escrever string para stream (função) Format Specifiers em C Adicionar a variável myvar1 à janela Watch (Durante a depuração, Debug / Windows / Watch / Watch 1) e defina a exibição como hexadecimal (na janela Watch, clique com o botão direito do mouse na variável e selecione Exibição hexadecimal). Agora a janela Watch mostra que ele contém o valor 0x0065. Para ver esse valor expresso como um caractere em vez de um inteiro, na coluna Nome, depois do nome da variável, adicione o especificador de formato de caractere, c. A coluna Valor agora aparece com 101 e. As tabelas a seguir mostram os especificadores de formato que você pode usar no Visual Studio. Os especificadores em negrito não são suportados para depuração de interoperabilidade com C / CLI. Quando o especificador de formato hv está presente, o depurador tenta determinar o comprimento do buffer e exibir o número apropriado de elementos. Como nem sempre é possível para o depurador encontrar o tamanho de buffer exato de uma matriz, você deve usar um especificador de tamanho (pBuffer, bufferSize) sempre que possível. O especificador de formato hv destina-se a cenários onde o tamanho do buffer não está prontamente disponível Se você tiver um ponteiro para um objeto que deseja exibir como uma matriz, você pode usar um número inteiro ou uma expressão para especificar o número de elementos de matriz:

No comments:

Post a Comment