Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

m4rcio_souza

converter char para int

Recommended Posts

Estou com o seguinte problema:usando o comando getch(), obtenho um char como '1', como faço para passar esse valor para uma variável int, pois igualando os dois obtenho o código asc (49) e não o valor 1 como desejado.Aguardo respostas, até mais

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, qndo você utiliza um char em C como se fosse um int, o C trabalha com o código ASC correspondente àquele char... Para fazer a conversão você precisa usar a função atoi da biblioteca <stdlib.h>: int atoi(const char* s);Acho q isso resolve teu problema...Beijos...Dani

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já que são só 10 os algarismos (1,2,3,4,5,6,7,8,9 e 0) use switchs.

 

Ex:

 

int Teste;
Naonumero:;
Teste=getch();
switch(Teste)
{
case 49:
Teste=1;
return 0;
case 50:
Teste=2;
return 0;
case 51:
Teste=3;
return 0;
case 52:
Teste=4;
return 0;
case 53:
Teste=5;
return 0;
case 54:
Teste=6;
return 0;
case 55:
Teste=7;
return 0;
case 56:
Teste=8;
return 0;
case 57:
Teste=9;
return 0;
case 48:
Teste=0;
return 0;
default:
goto Naonumero;
}

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O valor '1' já tem tipo (int). getch retorna um valor de tipo (int). O que você provavelmente quer é mapear strings contendo caracteres que expressam valores numéricos aos valores numéricos em si.

 

Sugiro, para isto, usar a função strtol. Isto porque atoi pode gerar undefined behavior.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como o guidjos disse, use strtol. Segundo o manual da função atoi, se o valor não puder ser convertido, o comportamento é indefinido.

Ao utilizar a strtol, se a conversão não puder ser realizada, o valor zero é retornado e a variável errno recebe o valor definido em EINVAL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aí, não tenho certeza mas não seria melhor usar scanf(%d,&variavel); ? Assim, funciona do mesmo jeito que o getch() porém não precisa usar strtol, pois já vem em inteiro.

 

Não tenho certeza.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não. A scanf é uma função (ruim) pra ler dados de entrada. Não tem nada a ver com conversões. E como eu disse, o (char) é por definição um tipo numérico inteiro. O tipo de 'a' é (int), e garantidamente este valor é representável em um objeto de tipo (char), qualquer que seja o encoding escolhido pela implementação (que, de novo, não precisa ser ASCII).

 

Cuidado pra não confundir a leitura dos dados com a conversão em si.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A subtração acima necessita que a codificação dos caracteres da implementação seja ASCII. Isto não é necessário em uma implementação de C. Pra garantir compatibilidade, é preciso usar strtol.

 

Não necessariamente, pois por padrão depois do primeiro algarismo, que é o zero, em qualquer codificação, deve proceder o restante dos mesmos de maneira sequencial crescente, ou seja, se o caractere U+0001 é 0 então U+0002 deve ser 1, U+0003 deve ser 2, U+0004 deve ser 3 e assim sucessivamente até o 9. Para situações como estas foram adicionados os apóstrofos na linguagem C, para assim manter a portabilidade do código.

Exemplo:

int i;
char c;
//...
i = c - 0x30; // Válido somente no ASCII.
//...
i = c - '1'; // Válido em qualquer codificação.
//...

 

Este tipo de recurso é utilizado na propria biblioteca GNU padrão de C, glibc:

/* Copyright (C) 1991, 1992, 1994 Free Software Foundation, Inc.

This file is part of the GNU C Library.

The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.

The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB.  If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA.  */

#include <ctype.h>
#include <limits.h>
#include <stddef.h>
#include <stdlib.h>


#ifndef	UNSIGNED
#define	UNSIGNED	0
#endif

/* Convert NPTR to an `unsigned long int' or `long int' in base BASE.
  If BASE is 0 the base is determined by the presence of a leading
  zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
  If BASE is < 2 or > 36, it is reset to 10.
  If ENDPTR is not NULL, a pointer to the character after the last
  one converted is stored in *ENDPTR.  */
#if	UNSIGNED
unsigned long int
#define	strtol	strtoul
#else
long int
#endif
strtol (nptr, endptr, base)
    const char *nptr;
    char **endptr;
    int base;
{
 int negative;
 register unsigned long int cutoff;
 register unsigned int cutlim;
 register unsigned long int i;
 register const char *s;
 register unsigned char c;
 const char *save;
 int overflow;

 if (base < 0 || base == 1 || base > 36)
   base = 10;

 s = nptr;

 /* Skip white space.  */
 while (isspace (*s))
   ++s;
 if (*s == '\0')
   goto noconv;

 /* Check for a sign.  */
 if (*s == '-')
   {
     negative = 1;
     ++s;
   }
 else if (*s == '+')
   {
     negative = 0;
     ++s;
   }
 else
   negative = 0;

 if (base == 16 && s[0] == '0' && toupper (s[1]) == 'X')
   s += 2;

 /* If BASE is zero, figure it out ourselves.  */
 if (base == 0)
   if (*s == '0')
     {
if (toupper (s[1]) == 'X')
  {
    s += 2;
    base = 16;
  }
else
  base = 8;
     }
   else
     base = 10;

 /* Save the pointer so we can check later if anything happened.  */
 save = s;

 cutoff = ULONG_MAX / (unsigned long int) base;
 cutlim = ULONG_MAX % (unsigned long int) base;

 overflow = 0;
 i = 0;
 for (c = *s; c != '\0'; c = *++s)
   {
     if (isdigit (c))
c -= '0';
     else if (isalpha (c))
c = toupper (c) - 'A' + 10;
     else
break;
     if (c >= base)
break;
     /* Check for overflow.  */
     if (i > cutoff || (i == cutoff && c > cutlim))
overflow = 1;
     else
{
  i *= (unsigned long int) base;
  i += c;
}
   }

 /* Check if anything actually happened.  */
 if (s == save)
   goto noconv;

 /* Store in ENDPTR the address of one character
    past the last character we converted.  */
 if (endptr != NULL)
   *endptr = (char *) s;

#if	!UNSIGNED
 /* Check for a value that is within the range of
    `unsigned long int', but outside the range of `long int'.  */
 if (i > (negative ?
   -(unsigned long int) LONG_MIN : (unsigned long int) LONG_MAX))
   overflow = 1;
#endif

 if (overflow)
   {
     errno = ERANGE;
#if	UNSIGNED
     return ULONG_MAX;
#else
     return negative ? LONG_MIN : LONG_MAX;
#endif
   }

 /* Return the result of the appropriate sign.  */
 return (negative ? -i : i);

noconv:
 /* There was no number to convert.  */
 if (endptr != NULL)
   *endptr = (char *) nptr;
 return 0L;
}

 

Uma solução para o problema em foco, dadas as circunstancias, seria:

int getin()
{
   int i = -1;
   char c;

   c = getch();

   if((c >= '0') && (c <= '9'))
       i = c - '0';

   return i;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para evitar confusões, onde disse: "biblioteca GNU padrão de C". Me expressei de forma errada na verdade seria: "biblioteca padrão de C da GNU".

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.