Ir ao conteúdo
  • Cadastre-se

C Função Atoi em C (string para int)


UmPrograma

Posts recomendados

Oi, como vão?

 

Alguem poderia olhar a seguinte funcao e me dizer porque nao esta retornando, ficaria grato.

 

Algo me intui que estou usando a funcao 'atoi' errado, mas nao sei se é somente isso. Esse exercicio se trata de uma funcao hash, onde cada letra da palavra UNIVERSIDADE tem que ser transformada em um indice da tabela hash.

 

Segue a funcao.

 

#include <stdio.h>
#include <string.h>

int tamanhoTabela = 16;

void convert (char *dado){
    int i, vet[strlen(dado)];
    for(i=0;i<strlen(dado);i++){
        vet[i]= 11*atoi(dado[i])/tamanhoTabela;
        printf("A letra %s ocupa na tabela a posicao %d.\n", dado[i], vet[i]);
    }
}
int main() {
    int i=0;
    char *dado = "UNIVERSIDADE";

    printf("\nA palavra a ser guardada na tababela hash sera UNIVERSIDADE.\n");


    convert(dado);
}

 

Link para o comentário
Compartilhar em outros sites

atoi não funciona para o seu caso. 

Ele converter NÚMEROS armazenados em uma string para o tipo inteiro.

Veja o exemplo abaixo:

#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    char *num = "123213";
    char *letras = "ABCDEF";
    printf("%d %d", atoi(num), atoi(letras));

    return 0;
}
 

A saída será:

123213 0

 

"UNIVERSIDADE" não tem números,  atoi sempre vai retornar 0.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Flávio Pedroza

 

Gente, não sabia.

 

E o que eu faço? Uso a posicao da letra na string como valor para minha equação?

adicionado 4 minutos depois

 

Assim me retorna a posição, mas tenho a leve sensação que quem escolheu a posição fui eu. Fora que teve colisões

 

#include <stdio.h>
#include <string.h>

int tamanhoTabela = 16;

void convert (char *dado){
    int i, vet[strlen(dado)], a=0;
    for(i=0;i<strlen(dado);i++){
        a++;
        vet[a]= 11*i/tamanhoTabela;
        printf("A letra %c ocupa na tabela a posicao %d.\n", dado[i], vet[a]);
    }
}
int main() {
    int i=0;
    char *dado = "UNIVERSIDADE";

    printf("\nA palavra a ser guardada na tababela hash sera UNIVERSIDADE.\n");

    convert(dado);
}

 

Link para o comentário
Compartilhar em outros sites

Tenta usar o código ascii de cada letra:

#include <stdio.h>
#include <string.h>


int tamanhoTabela = 16;

void convert (char *dado){
    int i, vet[strlen(dado)];
    for(i=0;i<strlen(dado);i++) {
        vet[i]= 11*(dado[i])/tamanhoTabela;
        printf("A letra %c ocupa na tabela a posicao %d.\n", dado[i], vet[i]); //"%c" , não "%s"
    }
}
int main() {
    int i=0;
    char *dado = "UNIVERSIDADE";

    printf("\nA palavra a ser guardada na tababela hash sera UNIVERSIDADE.\n");


    convert(dado);
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

O tipo char é um tipo inteiro, ou seja ele armazena números inteiros, e é o menor tipo inteiro disponível, especificamente com sinal pode guardar números de -128 até 127, e sem sinal de 0 até 255. Isso porque o tipo char tem 8 bits de comprimento, ou seja usa apenas 8 bits da memória do computador para armazenar números na forma binária, possibilitando armazenar apenas 256 números distintos.

 

(O tipo int consegue armazenar números bem maiores, pois segundo a especificação da linguagem C, int deve ter no mínimo 16 bits, mas normalmente é implementado com 32 bits. https://en.wikipedia.org/wiki/C_data_types )

 

Quando armazenamos um caractere numa variável char o que é guardado de fato é um número inteiro correspondente a este caractere, então para cada caractere existe um número correspondente definidos por tabelas de caracteres. Existem muitas tabelas de caracteres que variam muito entre si, mas ao menos para os caracteres básicos do alfabeto maiúsculo (A a Z) e minúsculo (a a z), e dígitos numéricos (0 a 9), e outros, há um consenso na grande maioria das tabelas de usar a mesma numeração.

 

Quando há necessidade de verificar os números correspondentes desses caracteres básicos a tabela ASCII é uma boa opção de consulta pois é uma tabela bem básica que lista a numeração destes caracteres. 

http://www.asciitable.com/

 

Então:

char c = 'A';

//É o mesmo que:

char c = 65;

 

 

Note também que como caracteres na verdade são números você pode fazer operações matemáticas e/ou comparações entre eles.

'C' - 'A' // = 2

'B' > 'A' //verdadeiro
  
'3' < '1' //falso

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Nao vou menti que meu cerebro bug um pouco quando tenho que fazer essas mudancas de letra para numero. Nao entendo estão bem. 

Mas valeu...

 

17 horas atrás, isrnick disse:

char c = 'A'; //É o mesmo que: char c = 65;

nessa parte quer dizer que o alfabeto com as letras maiuscalas comeca com o numero 65, ne?! legal

Link para o comentário
Compartilhar em outros sites

37 minutos atrás, UmPrograma disse:

 

17 horas atrás, isrnick disse:

char c = 'A'; //É o mesmo que: char c = 65;

nessa parte quer dizer que o alfabeto com as letras maiuscalas comeca com o numero 65, ne?! legal

 

Sim, pra ver na tabela ASCII (http://www.asciitable.com/) basta checar a coluna de números decimais (dec) o número correspondente para o caractere.

 

 

De fato o tipo char sempre guarda um número mesmo quando atribui um caractere, o que o compilador faz é guardar na variável o número correspondente ao caractere. Na hora de imprimir com especificador %c no printf() por exemplo, a função faz o contrário pega o número da variável char e imprime seu caractere correspondente da tabela de caracteres.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...