Jump to content

String para inteiro


Recommended Posts

Posted (edited)

Boas pessoal tou com uma pequena duvida em converter uma string para um inteiro usando o getchar()

#include <stdio.h>
int str2Inteiro(char vec[]) {
int n=0;
char digito;
int posicao=0;
digito=vec[posicao];
while (digito!='0') {
    n=n*10+(digito-'0');
    posicao=posicao+1;
    digito=vec[posicao];
}    
return n;
}
int lerNumero(){
    int num=0;
    char str[10];
int pos=0;
    printf("Insira um numero");
char digito=getchar();
//int num;
while(digito!='\n') {
    str[pos]=digito;
    pos++;
    digito=getchar();

}
    str[pos]=0;
num=str2Inteiro(str);
return num;
}
int main(void) {
int n1=0;
    int n2=0;
n1=lerNumero();
n2=lerNumero();
int media=(n1+n2)/2;
printf ("%d\n", media);
return 0;
}

A minha duvida reside no \n acho que tou no problema no criterio de paragem porque a conta da sempre errada e no debug ele come o \n mas continua ate ao fim do vector...estou a usar mal ou o criterio de paragem deve ser alterado?

Obrigado

Edited by pmg
identificacao da linguagem
Posted

Na funcao str2Inteiro() a condicao do while esta mal.

Tu nao queres parar quando encontrares um digito '0', queres parar no fim da string.

Imagina que o numero introduzido fosse 1001 🙂

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted (edited)
int string2inteiro(char string[]) {
int num = 0;
int i = 0;
while (string[i] != '\n') {
	num = num * 10;
	num += string[i] - 48; //ZERO_ASCII
	i++;
}
return num;
}
Edited by skinie18
Posted (edited)
       num += string[i] - 48; //ZERO_ASCII

Se usares '0' em vez de 48, o teu programa funciona em todos os sistemas de representação possíveis e imaginários. E tem ainda a vantagem de não precisar dum comentário 🙂

       num += string[i] - '0';

Mas tens de ter atenção a caracteres estranhos...

i = string2inteiro("RS232-C");
Edited by pmg
letras, etc

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted (edited)

a funçao chama-se "string2inteiro" nao estou a espera que vao para lá tentar estoura-la. mas posso resolver isso facilmente com um if.

int string2inteiro(char string[]) {
int num = 0;
int i = 0;
while (string[i] != '\n') {
if((int)string[i] > 47 && (int)string[i] < 58){
 num = num * 10;
 num += string[i] - 48; //ZERO_ASCII
 }
i++;
}
return num;
}
Edited by skinie18
Posted (edited)

a funçao chama-se "string2inteiro" nao estou a espera que vao para lá tentar estoura-la. mas posso resolver isso facilmente com um if.

fazes muito mal esperar tal coisa.

fazes ideia o porquê da minha assinatura do fórum ser : "I have been arrested in account of Murphy's law, 1º degree.". Pesquisa na net o que é a Lei de Murphy's.

/// Função usada para ler um número de uma string.
///
/// @param texto   Conjunto de caracteres em c-styles string.
/// @param inteiro Ponteiro para a variável que irá guardar o valor lido
///                da string
/// @return        Valor número que poderá ter os seguintes valores:
///                 0 = o número foi lido sem problemas.
///                -1 = o ponteiro dado como argumento da função é inválido
///                -2 = o processo de leitura foi interrompido ao detectar um
///                     caracter inválido
///                     (não é dígito nem o caracter de fim de string '\0')
int string2inteiro(char texto[], int * inteiro)
{
 int iter = 0;

 if (inteiro == NULL)
   return -1;

 *inteiro = 0;
 while (texto[iter] >= '0' && texto[iter] <= '9')
 {
   *inteiro = (10 * (*inteiro)) + texto[iter] - '0';
   iter++;
 }

 return texto[iter] == '\0' ? 0 : -2;
}

PS : alterei o nome da variável de string para texto porque parece que é possível definir este tipo de dados ao chamar uns headers na nova definição do C.

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Posted

Aquilo que o HappyHippyHippo diz é bem verdade, muitas vezes os inputs podem ser coisas radicalmente diferentes do que estás à espera e é bom ter isso em conta.

Claro que enquanto programador podes sempre definir o tipo de input e declarar que o comportamento caso não seja um número inteiro não está definido (na prática vais sempre devolver um inteiro mas sem qualquer significado) e quem está a utilizar a tua função é que tem que se preocupar em garantir que está a dar um input correcto.

Noutros casos, não precaver contra inputs "estranhos" pode até levar a que a tua função rebente com o programa e nesses casos é aconselhável ter em conta as várias possibilidades.

Não respondo a dúvidas por mensagem.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.