Thursday 30 November 2017

Opções itoa alternativas binárias


C ProgrammingC Referencestdlib. hitoa A função itoa (i nteger to A SCII) é uma extensa padrão não padronizada para a linguagem de programação C padrão. Não pode ser usado portatilmente, pois não está definido em nenhum dos padrões de linguagem C, no entanto, os compiladores geralmente o fornecem através do cabeçalho ltstdlib. hgt enquanto estiverem em modo não conforme, porque é uma contrapartida lógica para a função de biblioteca padrão atoi. Void itoa (int input, char buffer, int radix) itoa leva a entrada de valor de entrada inteira e converte-a em um número em base radix. O número resultante (uma seqüência de dígitos base-radix) é gravado no buffer tampão de saída. Dependendo da implementação, itoa pode retornar um ponteiro para o primeiro caractere no buffer. Ou pode ser projetado para que passar um buffer nulo faça com que a função devolva o comprimento da seqüência de caracteres que teria sido gravada em um buffer válido. Para converter um número para uma string na base 8 (octal), 10 (decimal) ou 16 (hexadecimal), uma alternativa compatível com o padrão é usar a função de biblioteca padrão sprintf. A função itoa apareceu na primeira edição de Kernighan e Ritchies The C Programming Language. Na página 60. A segunda edição do Idioma de Programação C (KampR2) contém a seguinte implementação do itoa. Na página 64 para as edições em espanhol, vá para a página 47. O livro observa vários problemas com esta implementação, incluindo o fato de que ele não trata corretamente o número 2 mais negativo de palavras-1. 1 O reverso de função usado acima é implementado duas páginas anteriormente: uma função itoa (e uma função semelhante, ftoa. Que converteu um flutuador para uma string) foi listada no manual Unix da primeira edição. 2 Ao contrário das versões acima, a versão da biblioteca Unix tinha uma interface aproximadamente equivalente a void itoa (int input, void (subr) (char)) e invocava o subtítulo da rotina de retorno de chamada em cada caractere na seqüência de saída, eliminando assim a necessidade Para um buffer grande o suficiente para manter toda a corda. Implementações de itoa () com testes de desempenho lexicalcast - alternativa C, parte das bibliotecas de reforço modpnumtoa - alternativa CC para converter inteiros e flutuadores em buffers char. Boa conversão Inteiro Para Ascii antiga: itoa - Outra implementação rápida de itoa para vários tipos de dados, além de algum envoltório estilo boost na forma de especializações de reforço :: lexicalcast template. Penso que o memcpy conseguiu. Memcopy vai copiar os bytes e não traduz os bytes para os caracteres (como você deseja fazer). Você não consegue ver porque 534 produz dois caracteres não imprimíveis. Tente usar 18505 e itll imprimir uma mensagem. Não é o que você quer embora. Se não estiver disponível, você sempre pode escrever o seu. Na verdade, esse é um problema comum de lição de casa em ciência da computação. Para fazê-lo, você precisa obter cada dígito separado do inteiro (a divisão inteira da dica truncará - exatamente o que queremos) e você precisará converter cada dígito de um número inteiro entre 0 e 9 e sua representação ascii. Isso sugestões suficientes, mas se você precisar de mais ajuda, então fique à vontade para perguntar. Resposta 16 de setembro 10 às 10:08 Se você estiver disponível, você pode usá-lo, esta função não faz parte do C, mas é suportada por alguns compiladores. Alternativamente, você pode fazer: respondeu 16 de setembro 10 às 9:42 É parte da lib standard C, portanto, esteja em qualquer compilador C ou C ndash Mark Sep 16 10 às 9:43 itoa não está disponível ndash Alex Sep 16 10 at 9:44 Mark: Não, itoa não faz parte da biblioteca padrão C. A função padrão C para fazer isso é sprintf (). Ndash caf 16 de setembro 10 às 11:19 Ok Eu interpretei mal algumas das páginas do man etc. ndash Mark Sep 16 10 às 14:24 Você também pode usar istringstream: respondido 16 de setembro 10 às 9:52 1 para uma abordagem C Isso realmente funciona Embora eu não tenha certeza. Eu, embora use ostringstream oss oss ltlt field e use oss. str () em vez de um buffer. Ndash Tony D 16 de setembro 10 às 11:46 Seu método não vai funcionar devido à codificação de caracteres e ao fato de 9 9. Mas por que não apenas construir seu próprio itoa É muito simples (sugestão: x - 0 irá dar 0 - 9 em 0 a 9), alternativamente, basta copiar a fonte para um itoa varient de qualquer um dos libstdcs de código aberto. O itoa era uma função auxiliar não padrão projetada para complementar a função padrão do atoi e, provavelmente, esconder um sprintf (a maioria dos recursos pode Ser implementado em termos de sprintf): cplusplusreferenceclibrarycstdlibitoa. html Use sprintf. Ou snprintf. Ou qualquer ferramenta que você encontrar. Apesar do fato de algumas funções não estarem no padrão, como mencionado corretamente por um em um de seus comentários, a maioria dos compiladores irá oferecer-lhe uma alternativa (por exemplo, o Visual C possui seu próprio snprintf, você pode digitar a snprintf se precisar). A maneira C. Use os fluxos C (no caso atual std :: stringstream (ou mesmo o std :: strstream obsoleto, como proposto por Herb Sutter em um de seus livros, porque é um pouco mais rápido). Conclusão Você está em C, o que significa que você pode Escolha o jeito que você quiser: o caminho mais rápido (ou seja, o modo C), mas você deve ter certeza de que o código é um gargalo na sua aplicação (otimizações prematuras são malignas, etc.) e que seu código é encapsulado com segurança para evitar arriscar buffer A maneira mais segura (ou seja, a maneira C), se você sabe que esta parte do código não é crítica, então, certifique-se de que esta parte do código não se quebre em momentos aleatórios porque alguém confundiu um tamanho ou um ponteiro (o que acontece em A vida real, como ontem, no meu computador, porque alguém achou legal usar o caminho mais rápido sem realmente precisar disso). Chris Kaminski: Se você estudar a interface do c stream39, você entenderá por que eles são mais lentos, mesmo quando a saída é simples Inteiro: em C, você usa seu próprio buffer, possivelmente alocado no sta Ck, enquanto que em C, o stringstream usará o seu próprio. Em C, você pode reutilizar seu buffer. Em C, você deve extrair a string do stringstream, que é uma cópia std :: string. Ndash paercebal 31 de maio 10 às 9:10 fuzzyTew: 1 Na minha publicação, falei sobre sprintf e suas variantes seguras, não só sprintf. 2 Saber onde seu código é compilado não é uma tarefa impossível (no meu caso, na pior das hipóteses, WindowsVC, SolarisCC e Linuxg, na melhor das hipóteses, somente WindowsVC). 3 Você está descrevendo um mundo onde os sabotadores tentando travar seu código são a norma. Meu mundo é composto por desenvolvedores normais, então perder tempo tentando proteger meu código de sabotadores reescrevendo minha versão quotsecurequot de cada API não é produtivo. . Ndash paercebal 8 set 11 às 11:06 fuzzyTew:. Conclusão Use a melhor ferramenta em questão. E se a melhor ferramenta for um sprintf escondido dentro de uma classe ou função de wrapper. Agora, se você defende a reescrita do sprintf como resposta para esta questão, sinta-se à vontade para escrever sua própria resposta. Não sei se o autor da pergunta lê todos os comentários. Ndash paercebal 8 de setembro 11 às 11:07 Eu escrevi esta função thread-safe há algum tempo e estou muito feliz com os resultados e sinto que o algoritmo é leve e magra, com desempenho que é cerca de 3X a função padrão de MSVC itoa (). Heres o link. Optimal Base-10 apenas a função itoa () O desempenho é pelo menos 10X do de sprintf (). O benchmark também é o teste de QA de funções, da seguinte forma. Há algumas sugestões tolas feitas sobre o uso do armazenamento dos chamadores que deixaria o resultado flutuando em algum lugar em um buffer no espaço de endereço do chamador. Ignore-os. O código que eu listei funciona perfeitamente, como demonstra o código benchmarkQA. Eu acredito que este código é suficientemente simples para usar em um ambiente incorporado. YMMV, é claro. Respondeu Jul 1 14 às 7:54 2017 Stack Exchange, IncConvert inteiro para seqüência de caracteres (função não padrão) Converte um valor inteiro para uma seqüência de terminação nula usando a base especificada e armazena o resultado na matriz dada pelo parâmetro str. Se a base for 10 e o valor for negativo, a sequência resultante será precedida de um sinal de menos (-). Com qualquer outra base. O valor sempre é considerado não assinado. Str deve ser uma matriz o suficiente para conter qualquer valor possível: (sizeof (int) 81) para radix2. Ou seja, 17 bytes em plataformas de 16 bits e 33 em plataformas de 32 bits. Valor de parâmetros Valor a ser convertido em uma string. Str Array na memória onde armazenar a sequência resultante nulo-terminada. Base base numérica usada para representar o valor como uma string, entre 2 e 36. Onde 10 significa base decimal, 16 hexadecimal, 8 octal e 2 binários. Valor de retorno Um ponteiro para a seqüência de terminação nula resultante, igual ao parâmetro str. Portabilidade Esta função não está definida em ANSI-C e não é parte de C, mas é suportada por alguns compiladores. Uma alternativa padrão para alguns casos pode ser sprintf: sprintf (str, d, value) converte em base decimal. Sprintf (str, x, value) converte-se em base hexadecimal. Sprintf (str, o, value) converte para base octal. Sprintf Escreva dados formatados para string (função) atoi Converta string to integer (function) atol Converta string to long integer (function)

No comments:

Post a Comment