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).sprintf sprintf Retorna uma seqüência de caracteres formatada pelas convenções de printf habituais da função de biblioteca de C sprintf. Veja abaixo para mais detalhes e veja sprintf (3) ou printf (3) em seu sistema para 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 sprintf local (3), portanto, não estão disponíveis a partir do Perl. Ao contrário do printf. Sprintf não faz o que você provavelmente quer dizer quando você passa uma matriz como seu primeiro argumento. O array é dado contexto escalar, e em vez de usar o 0 º elemento da matriz como o formato, Perl usará a contagem de elementos na matriz como o formato, 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 significar para trás), Perl permite essas conversões desnecessárias mas amplamente suportadas: Note que o número de conversões 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 é dependente do sistema: pode ser três ou menos (zero-padded conforme necessário). Em outras palavras, 1,23 vezes dez para o 99 pode ser 1,23e99 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 dupla longa pode causar surpresas. Entre o e a letra do 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 sprintf irá formatar o próximo argumento não utilizado na lista, mas isso permite que você tome os argumentos fora de ordem: Quando um espaço e um sinal de mais são dadas Como as bandeiras de uma vez, o espaço é ignorado. Quando a sinalização e uma precisão são dadas na conversão o, a precisão é incrementada se for necessário para o líder 0. Este sinalizador diz Perl para interpretar a seqüência fornecida como um vetor de inteiros, um para cada caractere na seqüência de caracteres. O Perl aplica o formato a cada inteiro, por sua vez, e depois associa 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 a ser usada para separar os números: Você também pode especificar explicitamente o número do argumento a ser usado para a cadeia de junção usando algo como 2v para Exemplo: Argumentos geralmente são formatados para ser tão ampla quanto necessário para exibir o valor especificado. Você pode substituir a largura colocando um número aqui, ou obter a largura do próximo argumento (com) ou a partir de um argumento especificado (por exemplo, com 2): Se uma largura de campo obtida através de é negativo, tem o mesmo efeito que o - Flag: left-justification. Você pode especificar uma precisão (para conversões numéricas) ou uma largura máxima (para conversões de seqüência) especificando a. Seguido por um número. Para formatos de ponto flutuante, exceto g e G. Isso especifica quantos lugares à direita do ponto decimal para mostrar (o padrão é 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 os seguintes: Por 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 de é negativa, ele conta como não tendo nenhuma precisão em tudo. 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 de número inteiro (duox X bi DUO), os números normalmente são assumidos como sendo o tamanho inteiro padrão na sua plataforma (geralmente 32 ou 64 bits), mas você pode substituí-lo para usar um dos tipos padrão C, como suportado Pelo compilador usado para criar o Perl: A partir de 5.14, nenhum destes levanta uma exceção se eles não são 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. Se você preferir uma exceção, faça o seguinte: Se você gostaria de saber sobre uma dependência de versão antes de começar a executar o programa, coloque algo como isto no topo: Você pode descobrir se o seu Perl suporta quads via Config: (Efg EFG), os números normalmente são assumidos como sendo o tamanho padrão flutuante em sua plataforma (duplo ou duplo longo), 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 inteiro Perl ou número de ponto flutuante, que é o padrão. Normalmente, sprintf leva 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 a para a largura e precisão eb como o valor para formatar. Aqui estão alguns exemplos mais ao estar ciente de que ao usar um índice explícito, pode precisar escapar: Se usar localidade (incluindo o uso de localidade 39: notcharacters39) está 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 pela localidade LCNUMERIC. Veja perllocale e POSIX. 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 você puder Atenção: Isso é sobre o comando Bash-builtin printf - no entanto , A descrição deve ser quase idêntica 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 reconhecidas para dar um número de argumento para printf. printf e scanf número de códigos de formato com até seis dígitos de Precisão, notação científica Nota de rodapé: Em printf (), as promoções de tipo de expressão são esperadas - em uma expressão, char e short são convertidos em int, eo float é convertido em duplo. Assim c corresponde realmente a um parâmetro de tipo int e f e g correspondem realmente a parâmetros do tipo double. 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 para que nenhum tipo de promoções ocorram ou são esperados. Assim f e lf são bastante diferentes em scanf, mas o mesmo em printf. Pessoalmente, eu costumava usar lg rotineiramente para duplos em printf e scanf, mas isso está 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 o que você usa para printf porque a função de biblioteca printf trata-los como sinônimos, mas é crucial para obtê-lo direito para scanf. Printf modificadores de formato Modificadores aparecem entre a e a letra-chave. 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 pad com zeros à 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ê tem uma largura de campo, você deve escrevê-lo de tal forma que ele não começa com um zero (e, em seguida, você pode prepend um zero como um caractere de modificador se você quiser que). 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. Ele não tem problemas com várias chamadas em um printf ().
No comments:
Post a Comment