blck Posted September 20, 2012 at 08:45 PM Report #476025 Posted September 20, 2012 at 08:45 PM (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 September 20, 2012 at 08:48 PM by pmg identificacao da linguagem
pmg Posted September 20, 2012 at 08:54 PM Report #476027 Posted September 20, 2012 at 08:54 PM 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!
HappyHippyHippo Posted September 20, 2012 at 09:23 PM Report #476029 Posted September 20, 2012 at 09:23 PM para pensares : o que acontece se eu escrever "12a34" ? 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Guest skinie18 Posted September 21, 2012 at 07:33 PM Report #476130 Posted September 21, 2012 at 07:33 PM (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 September 21, 2012 at 07:33 PM by skinie18
pmg Posted September 21, 2012 at 07:43 PM Report #476132 Posted September 21, 2012 at 07:43 PM (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 September 21, 2012 at 07:45 PM 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!
HappyHippyHippo Posted September 21, 2012 at 07:57 PM Report #476135 Posted September 21, 2012 at 07:57 PM 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; } para pensares : o que acontece se eu escrever "12a34" ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Guest skinie18 Posted September 22, 2012 at 09:21 AM Report #476178 Posted September 22, 2012 at 09:21 AM (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 September 22, 2012 at 09:21 AM by skinie18
HappyHippyHippo Posted September 22, 2012 at 09:47 AM Report #476179 Posted September 22, 2012 at 09:47 AM (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 September 22, 2012 at 09:52 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
mundo Posted September 23, 2012 at 09:02 AM Report #476244 Posted September 23, 2012 at 09:02 AM Fala por experiencia própria, essa Lei de Murphy's é bem verdade xD
pedrosorio Posted September 23, 2012 at 01:14 PM Report #476252 Posted September 23, 2012 at 01:14 PM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now