Jump to content

Problema em usar atoi()


ChicoCarvalho
 Share

Recommended Posts

Podes postar o código?

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

A funcao atoi() quer como parametro uma string. O objecto argv[1][pos] é um char: por isso nao compila.

O que queres exactamente?

Por exemplo se a linha de comandos (depois do programa compilado) for ./a.out 6078?

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!

Link to comment
Share on other sites

Se esse é o teu problema, porque não resolves da forma óbvia? Crias uma função para isso:

int my_atoi(char c) {
    if (c >= '0' && c <='9') return (int)(c - '0');
    return -1; // error
}

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

Atenção que segundo a minha ideia a função isdigit apenas te devolve o número correspondente a um caracter apenas, enquanto a função atoi, devolve um número com 2 ou mais digitos. No entanto porque estou a usar essa função agora e ela não me reconhece números com sinal negativo.

Por exemplo: "-80"  a função atoi devolve um int como 80.

Link to comment
Share on other sites

A função isdigit() devolve um indicador (0 (zero) para indicador falso; outra coisa para indicador positivo) se o valor passado é um digito. Não serve para converter strings em inteiros; "apenas" serve para usar numa rotina que faz a conversão para detectar caracteres inválidos.

Por exemplo: "-80"  a função atoi devolve um int como 80.

O atoi("-80") tem de devolver -80!

Se te devolve 80, estás a fazer qualquer coisa mal.

int a = atoi("-80");
printf("a tem %d\n", a);

Código completo no ideone.

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!

Link to comment
Share on other sites

Obrigado pela ajuda... Tenho mais uma duvida em relacao a um funcao que tenho um vector de inteiros e o quero retornar para na main o imprimir... A minha sugestao seria int[] funcao(....,...) e na main criar um int vec[4] = funcao(...,...); mas pelos visto esta algo mal na sintaxe.. Alguem me pode ajudar?

Link to comment
Share on other sites

Os arrays (vectores), em C, não são atribuiveis. Isto é não podes mudar o valor de um array como um todo, tens de o fazer elemento a elemento.

A maneira correcta é passar o array para a função, e, dentro da função, alterar o valor dos elementos. Nota que o array é passado como um ponteiro para o primeiro elemento e, portanto, a informação de tamanho perde-se; convem passar o tamanho além do ponteiro.

Para passar o array (como ponteiro) e o tamanho podes usar este exemplo

int array[10] = {0};
fx(array, sizeof array / sizeof *array);

Na função tratas o ponteiro exactamente como um array

void fx(int array[], size_t size) {
    size_t k;
    for (k = 0; k < size; k++) {
        array[k] = k;
    }
}


Se quiseres "criar" o array dentro da função e passá-lo para trás, para a função chamadora, tens de usar malloc() e amigos ... mas o melhor é fazer a alocação atrás e passar o ponteiro como no exemplo acima.

Edit para adicionar exemplo completo

#include <stdio.h>

int funcao(int vec[], size_t siz); /* prototipo --- int vec[] é exactamente igual a int *vec */

int main(void) {
    int vec[4]; /* 4 elementos nao inicializados; a inicializacao sera feita na funcao funcao */
    funcao(vec, sizeof vec / sizeof *vec); /* inicializa vec */
    for (int i = 0; i < 4; i++) {
        printf("O elemento de indice %d tem o valor %d.\n", i, vec[i]);
    }
    return 0;
}

int funcao(int vec[], size_t siz) {
    for (size_t i = 0; i < siz; i++) {
        vec[i] = i * i * i;
    }
    return 0; /* 0 indica que tudo correu bem. Pode ser ignorado na funcao que chama esta */
}

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!

Link to comment
Share on other sites

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
 Share

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