Acho que o memcpy teve êxito. Memcopy vai copiar os bytes e não traduzir os bytes em caracteres (como você quer fazer). Você não pode ver porque 534 acontece para produzir dois caracteres não imprimíveis. Experimente usar 18505 e itll imprimir uma mensagem. Não o que você quer embora. Se itoa isnt disponível, então você sempre pode escrever o seu próprio. Na verdade isso é um problema comum de lição de casa de informática. Para fazer isso você precisa obter cada dígito separado do inteiro (a divisão inteira sugestão truncará - exatamente o que queremos) e você precisará converter cada dígito de um inteiro entre 0 e 9 e sua representação ascii. Isso é dicas suficientes, mas se você precisar de mais ajuda, então sinta-se livre para perguntar. Se itoa se disponível você pode usá-lo, esta função não é parte de C, mas é apoiado por alguns compiladores. Alternativamente você pode fazer: respondido Sep 16 10 em 9:42 É parte do C padrão lib tão doente estar em qualquer conformidade C ou compilador c ndash Mark Sep 16 10 at 9:43 itoa não está disponível ndash Alex Sep 16 10 at 9:44 Marca: Não, itoa não faz parte da biblioteca padrão C. A função padrão C para fazer isso é sprintf (). Ndash caf Sep 16 10 at 11:19 Ok eu li algumas das páginas man etc ndash Mark Sep 16 10 at 14:24 Você pode usar também istringstream: respondeu Sep 16 10 at 9:52 1 para uma abordagem C Isso realmente funciona Embora eu não tenha certeza. Eu ainda uso ostringstream oss oss ltlt campo e uso oss. str () em vez de um buffer. Ndash Tony D Sep 16 10 às 11:46 Seu método não está indo para o trabalho devido à codificação de caracteres e o fato 9 9. Mas por que não apenas construir o seu próprio itoa Seu muito simples (dica: x - 0 vai virar 0 - 9 em 0-9), alternativamente, basta copiar a fonte para um variante itoa de qualquer um do código aberto libstdcsC ProgrammingC Referencestdlib. hitoa A função itoa (i nteger to A SCII) é uma extensão não-padrão generalizada para a programação C padrão língua. Não pode ser usado de forma portátil, uma vez que não está definido em qualquer um dos padrões de linguagem C, no entanto, os compiladores muitas vezes fornecê-lo através do cabeçalho ltstdlib. hgt enquanto em modo não conforme, porque é uma contrapartida lógica para a função de biblioteca padrão atoi. Void itoa (entrada int, char buffer, int radix) itoa toma a entrada de valor de entrada inteira e converte-a para um número na base radix. O número resultante (uma seqüência de dígitos base radix) é gravado no buffer de buffer de saída. Dependendo da implementação, itoa pode retornar um ponteiro para o primeiro caractere no buffer. Ou pode ser concebido para que passando um buffer nulo faz com que a função para retornar o comprimento da seqüência de caracteres que teria sido escrito em um buffer válido. Para converter um número em uma string na base 8 (octal), 10 (decimal) ou 16 (hexadecimal), uma alternativa compatível com 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 The C Programming Language (KampR2) contém a seguinte implementação de itoa. Na página 64 para as edições em espanhol, vá para a página 47. O livro observa vários problemas com essa implementação, incluindo o fato de que ele não trata corretamente o número 2 mais negativo numberize-1. 1 A função reverse usada acima é implementada duas páginas mais cedo: Uma função itoa (e uma função similar, ftoa., Que converteu um flutuador em uma string) foi listada no manual Unix de primeira edição. 2 Ao contrário das versões dadas acima, a versão da biblioteca Unix tinha uma interface quase equivalente a void itoa (int input, void (subr) (char)) e invocava a subr de rotina callback em cada caractere da string de saída, eliminando assim a necessidade Para um buffer grande o suficiente para armazenar toda a seqüência. Implementações itoa () com testes de desempenho lexicalcast - Alternativa C, parte das bibliotecas boost modpnumtoa - Alternativa CC para converter inteiros e flutuadores em char buffers. Good old Integer To Ascii conversão: itoa - Outra implementação rápida de itoa para vários tipos de dados, além de alguns impulso estilo envolvimento na forma de boost :: lexicalcast modelo de especializações. Arqueologia itoa era uma função auxiliar não padrão projetado para complementar o padrão atoi E provavelmente esconder um sprintf (a maioria das suas características podem ser implementadas 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 estão no padrão, como bem mencionado por onebyone em um de seus comentários, a maioria dos compiladores lhe oferecerá uma alternativa (por exemplo, Visual C tem seu próprio snprintf você pode typedef para snprintf se você precisar dele). O caminho 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 a maneira que você quer: A maneira mais rápida (ou seja, a maneira C), mas você deve ter certeza que o código é um gargalo em sua aplicação (otimizações prematuras são maus, etc) e que o seu código é encapsulado com segurança para evitar risco de 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 é melhor certificar-se de que esta parte do código não quebra em momentos aleatórios porque alguém confundiu um tamanho ou um ponteiro (que acontece em A vida real, como, ontem, no meu computador, porque alguém pensou que era legal usar a maneira mais rápida sem realmente precisar dele.) Chris Kaminski: Se você estudar a interface c stream39s, você vai entender por que eles são mais lentos, mesmo quando a saída de um 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 o buffer. Em C, você deve extrair a seqüência de caracteres do stringstream, que é uma std :: string copy. Ndash paercebal May 31 10 at 9:10 fuzzyTew: 1 No meu post, 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, apenas WindowsVC). 3 Você está descrevendo um mundo onde os sabotadores tentando bater seu código são a norma. Meu mundo é composto por desenvolvedores normais, por isso perder tempo tentando proteger meu código de sabotadores reescrevendo minha versão quotsecurequot de cada API não é produtivo. . Ndash paercebal Sep 8 11 em 11:06 fuzzyTew:. Conclusão Use a melhor ferramenta à mão. E se a melhor ferramenta é um sprintf escondido dentro de uma classe wrapper ou função. Agora, se você defender a reescrita de sprintf como uma resposta para esta pergunta, sinta-se livre para escrever sua própria resposta. Não sei se o autor da pergunta lê todos os comentários. Eu escrevi esta função thread-safe há algum tempo, e estou muito feliz com os resultados e sentir o algoritmo é leve e magra, com o desempenho que é de cerca de 3X a função MSVC padrão itoa (). Aqui está o link. Função Optimal Base-10 somente itoa () O desempenho é pelo menos 10 vezes superior ao de sprintf (). O benchmark é também o teste QA de funções, como se segue. Há algumas sugestões tolas feitas sobre o uso do armazenamento chamadores que iria deixar o resultado flutuando em algum lugar em um buffer no espaço de endereço chamadores. Ignore-os. O código que eu listei funciona perfeitamente, como demonstra o código de benchmarkQA. Eu acredito que este código é magro o suficiente para usar em um ambiente incorporado. YMMV, é claro. Respondeu Jul 1 14 em 7:54 2017 Stack Exchange, Inc
No comments:
Post a Comment