Ir ao conteúdo
  • Cadastre-se

C Conversão de string para inteiro


luis.paulo

Posts recomendados

Meu programa tem que receber um número por extenso entre 0 e 999 e converter para inteiro. Até agora converte o que está nos vetores mas não converte outros números como por ex: 21(vinte e um).

#include <stdio.h>
#include <string.h>
char unid[9][5]={"zero","um","dois","tres","quatro","cinco","seis","sete","oito","nove",};
char dez[10][20]={"","dez","onze","doze","treze","catorze","quinze","dezesseis","dezessete","dezoito","dezenove"};
char dez2[10][20]={"","vinte","trinta","quarenta","cinquenta","sessenta","setenta","oitenta","noventa"};
char cent[10][20]={"","cento","duzentos","trezentos","quatrocentos","quinhentos","seiscentos","setecentos","oitocentos","novecentos"};


int main(){
    int i;
    char num_ext[999];

    printf("Digite um numero: ");
    scanf("%[^\n]s", num_ext);


    for(i=0;i<999;i++){
        if(strcmp(num_ext,unid[i])==0){
            printf(" => %s eh igual a -> %d\n",num_ext,i);
        }
        else if(strcmp(num_ext,dez[i])==0){
            printf(" => %s eh igual a -> %d\n",num_ext,i+9);
        }
        else if(strcmp(num_ext,dez2[i])==0){
            printf(" => %s eh igual a -> %d\n",num_ext,i+19);
        }
        else if(strcmp(num_ext,cent[i])==0){
            printf(" => %s eh igual a -> %d\n",num_ext,i+198);
        }

    }
    return 0;
}

 

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

Tem uns quantos "bugaços" neste programa. Por exemplo... Em char unidade[9][5] está permitido 9 strings de 5 caracteres como muito, a string "quatro" tem 7 chars, já sei que vai me dizer que estou louco, porque tem seis letras, mas lembre que você tem que deixar uma a mais, para o nulo, seis mais um, sete, tamanho minimo dessa string deveria ser char unidade[9][7], ou para não ficar curto, como os outros unidade[9][20]. Sem contar que você tem 10 strings nessa matriz, e você só declarou 9. >_<

Arruma esses bugs rapaz... e logo me conta como te foi.

adicionado 2 minutos depois

arrume tanto a quantidade de elementos como a quantidade mínima de chars que deve ser a da maior string contida na matriz mais 1.

adicionado 3 minutos depois

Vou dar uma pista... Tem erros tanto em unid como em dez.

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

@vangodp Assim?

char unid[10][7]={"zero","um","dois","tres","quatro","cinco","seis","sete","oito","nove",};
char dez[11][10]={"","dez","onze","doze","treze","catorze","quinze","dezesseis","dezessete","dezoito","dezenove"};
char dez2[9][10]={"","vinte","trinta","quarenta","cinquenta","sessenta","setenta","oitenta","noventa"};
char cent[10][13]={"","cem","duzentos","trezentos","quatrocentos","quinhentos","seiscentos","setecentos","oitocentos","novecentos"};

 

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

9 horas atrás, luis.paulo disse:

@vangodp Assim?


char unid[10][7]={"zero","um","dois","tres","quatro","cinco","seis","sete","oito","nove",};
char dez[11][10]={"","dez","onze","doze","treze","catorze","quinze","dezesseis","dezessete","dezoito","dezenove"};
char dez2[9][10]={"","vinte","trinta","quarenta","cinquenta","sessenta","setenta","oitenta","noventa"};
char cent[10][13]={"","cem","duzentos","trezentos","quatrocentos","quinhentos","seiscentos","setecentos","oitocentos","novecentos"};

 

Fui testar seu código, e todos os numero da char dez2 tava dando outros números, e inclusive o número 13 também.

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

@luis.paulo     seu código está bom , e para converter números maior que dez , precisa estabelecer esses valores lá no vetor de strings , e assim para os primeiros 999 acima de zero , você pode usar um código parecido com esse aqui  :

#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <windows.h>
#define H GetStdHandle(STD_OUTPUT_HANDLE)
#define cls system("cls");
void textcolor_2(int l,int f){SetConsoleTextAttribute(H,l+(f<<4));}
void gotoxy_2(int x,int y){COORD c={x,y};SetConsoleCursorPosition(H,c);}
char palavras[42][15]={
     "zero"       , "um"           , "dois"       ,"tres"       , "quatro"    ,
     "cinco"      , "seis"         , "sete"       ,"oito"       , "nove"      ,
     "dez"        , "onze"         , "doze"       ,"treze"      , "quatorze"  ,
     "quinze"     , "dezesseis"    , "dezessete"  ,"dezoito"    , "dezenove"  ,
     ":"          , ","            , "vinte"      ,"trinta"     , "quarenta"  ,
     "cinquenta"  , "sessenta"     , "setenta"    ,"oitenta"    , "noventa"   ,
     ":"          , "cem"          , "cento"      ,">"          , "duzentos"  ,
     "trezentos"  , "quatrocentos" , "quinhentos" ,"seiscentos" , "setecentos",
     "oitocentos" , "novecentos" } ,
     dep[3][15]   ,
     palavras_validas[3][15]       ;
int letras[25][5]={{15,16,14, 1,30}, /* S */
                   {14,17,31,17,17}, /* A */
                   {14, 4, 4, 4,14}, /* I */
                   {17,25,21,19,17}, /* N */
                   {30,17,17,17,30}, /* D */
                   {14,17,17,17,14}, /* O */
                   { 0, 0, 0, 0, 0}, /*   */
                   { 1, 2, 4, 0,16}, /* ! */
                   {17,25,21,19,17}, /* N */
                   {17,17,17,17,14}, /* U */
                   {17,27,21,17,17}, /* M */
                   {31,16,30,16,31}, /* E */
                   {30,17,30,18,17}, /* R */
                   {14,17,17,17,14}, /* O */
                   {15,16,14, 1,30}, /* S */
                   {30,17,30,16,16}, /* P */
                   {14,17,17,17,14}, /* O */
                   {30,17,30,18,17}, /* R */
                   {31,16,30,16,31}, /* E */
                   {17,10, 4,10,17}, /* X */
                   {31, 4, 4, 4, 4}, /* T */
                   {31,16,30,16,31}, /* E */
                   {17,25,21,19,17}, /* N */
                   {15,16,14, 1,30}, /* S */
                   {14,17,17,17,14}, /* O */
                   };
void desenhar(int y,int n){
    int w,px,py,x;                            /* variáveis simples                       */
    CONSOLE_SCREEN_BUFFER_INFO SBInfo;        /* informações sobre a buffer da tela      */
    GetConsoleScreenBufferInfo(H, &SBInfo);   /* pega a posição do cursor do console     */
    px = SBInfo.dwCursorPosition.X;           /* pX posição da col do cursor no console  */
    py = SBInfo.dwCursorPosition.Y;           /* pY posição da linh do cursor no console */
    int y1=py+2,x1=20,y2=y1,x2=x1,j,i,a,b;    /*y1=linh ini y2 p/ recuperar a linh inici */
    if(n==3)x2+=12;
    for(i=0;i<n;i++){                /* sao 8 letras                                     */
        for(j=0;j<5;j++){            /* o caractere é de 5 linhas                        */
            x1 = x2;
            a=letras[i+y][j];        /* pega o numero da 1 linha do caractere            */
            for(b=0;b<5;b++){        /* aqui eh um numero de apenas 8 bits               */
                gotoxy_2(x1,y1);
                if(a % 2 != 0){      /* se bit 0 igual 1                                 */
                    printf("%c",219);/* coloc espaço invertido senão coloc espaço normal */
                }
                else{
                    printf(" ");     /* senão coloca espaço normal                       */
                }
                a=a/2;               /* dividir numero por 2 desloca os bits para direita*/
                x1--;
                if(n==8)Sleep(10);
            }
            y1++;                    /* muda para proxima linha                          */
            x1=x2;                   /* volta para a coluna inicial                      */
        }                            /* proxima linha                                    */
        x2=x2+6;                     /* avança 6 colunas posicionando para o prox caract */
        y1=y2;                       /* volta para linha inicial                         */
    }                                /* imprimiu o primeiro caractere                    */
}
void borda(char *barra){
    int j;
    textcolor_2(11,0);
    printf("%s",barra);
    for(j=0;j<23;j++){
        gotoxy_2(0,j);
        printf("%c",186);
        gotoxy_2(79,j);
        printf("%c",186);
    }
    printf("%s",barra);
    gotoxy_2(0 , 0);printf("%c",201);
    gotoxy_2(79, 0);printf("%c",187);
    gotoxy_2( 0,23);printf("%c",200);
    gotoxy_2(79,23);printf("%c",188);
}
int main(){
    int j,q,z,i,tm,k,m,w,val,c,flag;
    char num_ext[35],nome[20]={},op,barra[81]={};
    for(j=0;j<80;j++)barra[j]=(char)205;barra[80]='\0';
    do{
        textcolor_2(14,0);
        cls;
        borda(barra);
        gotoxy_2(0,0);
        textcolor_2(14,0);
        desenhar( 8,7);
        desenhar(15,3);
        desenhar(18,7);
        textcolor_2(14,0);
        val=0;
        i=-1;
        c=0;
        w=0;
        z=0;
        gotoxy_2(5,20);
        printf("Digite um numero em forma de texto : ");
        fflush(stdin);
        scanf("%[^\n]s",num_ext);/* num por extenso é em forma de palavras */
        do{
            c=-1;
            do{
                i++;
                c++;
                if(num_ext[i]!=' '&& num_ext[i] != '\0'){
                    nome[c] = num_ext[i];                        /* pega a palavra do nome */
                }
            }while(num_ext[i] != ' ' && num_ext[i+1] != '\0' );  /* até completar a palavra ou terminar a frase */
            if(strlen(nome) > 0 )
                if(num_ext[i+1]=='\0')c++;
            nome[c]='\0';
            if(num_ext[i]==' '){
                if(num_ext[i+1]=='e')i+=2;
            }
            flag=0;
            k=0;
            m=1;
            for(j=0;j<42;j++){
                if(strcmp(nome,palavras[j])==0){                 /* verifica qual número */
                    if(strcmp(palavras[j+1],">")==0){k--;j++;}   /* cem e cento é a mesma coisa */
                    val+=(m*k);                                  /* calcula o valor do número */
                    strcpy(palavras_validas[z],nome);            /* arquiva as palavras que não são números */
                    z++;                                         /* próxima posição no vetor */
                    flag=1;                                      /* informa que encontrou a palavra */
                    break;                                       /* e sai desse loop For */
                }
                else{                                            /* se não é um número */
                    if(strcmp(palavras[j],":")==0){              /* dois pontos significa */
                        m*=10;                                   /* multiplicar por dez o multiplicador */
                        k=0;                                     /* reseta o multiplicando */
                        if( strcmp(palavras[j+1],",")==0 ){      /* vrgula significa */
                            k=1;                                 /* multiplicando igual a hum */
                            j++;                                 /* avança para o próximo caractere */
                        }
                    }
                }
                if(strcmp(palavras[j],">")==0)                   /* menorque significa */
                    k-=2;                                        /*decrementar em dois o multiplicando */
                k++;                                             /* incrementa o multiplicando */
            }
            if( ! flag ){                                        /* se flag igual a zero , palavra não é um número */
                strcpy(dep[w],nome);                             /*  guarda a palavra */
                w++;                                             /* incremnta a posição no vetor de palavras inválidas */
            }
        }while( num_ext[ i+1 ] != '\0' );                        /* repete até terminar a frase */
        gotoxy_2(5,22);                                          /* posiciona o cursor na col 5 e linha 22 da tela */
        textcolor_2(11,0);                                       /* colorir as letras */
        if( z ){                                                 /* se z diferente de zero */
            for(q=0;q<z;q++){
                printf("%s",palavras_validas[q]);                /* imprime todas as palavras */
                if(z>1 && q<z-1)printf(" e ");
            }
        }
        else{
            printf("%s ",num_ext);                               /* imprime o que foi digitado pelo usuário */
        }
        printf(" %c igual => %d\n",130,val);                     /* mostra o valor do número digitado */
        if( w ){                                                 /* se w diferente de zero */
            textcolor_2(10,12);                                  /* colorir as letras */
            for(q=0;q<w;q++)
                printf(" A Palavra %12s N%co Condiz Com Os Fatos . . . ! \n",/* imprime as palavras inválidas */
                       dep[q],198);
        }
        textcolor_2(12,15);                                      /* colorir as letras */
        gotoxy_2(25,24);
        printf("   outro numero S/N     \b\b\b");
        flag=1;
        op=' ';
        while( ! kbhit()&&flag){
            op=(char)getch();
            if(op!=' ')flag=0;
        }
        printf("\n");
    }while( toupper(op) != 'N' );
    textcolor_2(11,0);
    printf("\n\n");
    desenhar(0,8);
    printf("\a\n\n");
    textcolor_2(10,12);
    return 0;
}

 

  • Amei 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!