Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Jamerson Walderson

C Funcao atoi com vetor

Recommended Posts

Boa noite mestres,

a dois dias estou tentando fazer algo parecido com o código abaixo pois preciso converter um valor que foi digitado em uma váriavel CHAR e processar cada caractere individualmente(matriz) e assim retornar a resposta em INT.


 

char numero[2];
int conv, i;
for (i =0; i<2; i++)
	conv = atoi(numero[i]);

 

O que tenho até o momento é isso aqui:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
Entendendo a função atoi
Este código servira como base para o exercicio 1212 do URI Judge.
*/

int main(int argc, char *argv[]) {
	char antes[2];
	int conv[2];
	int i;
//Entrada	
	printf ("Digite o numero(string):. ");
	//scanf ("%c", &antes); Tentativa com scanf porque achei que era problema no gets... sem sucesso
	gets(antes);
//Processamento		
	for (i=0; i<2; i++){
	//	conv[i] = antes[i]; Tentei dessa forma mas também não funcionou
		conv[i] = atoi(antes[i]);
	}		
//Saida
	printf ("Convertido(int):. %d\n", conv);		
	return 0;
}

Resumindo minha dúvida é se tem alguma forma de converter individualmente os valores char de um vetor usando a função atoi ou alguma outra coisa?

adicionado 16 minutos depois

Segue o erro que o dev c++ esta retornando

erro devc++ atoi.png

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jamerson Walderson sim tem como converter usando atoi, mas a atoi converte string, então você precisa pegar cada número individualmente como uma string assim :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
Entendendo a função atoi
Este código servira como base para o exercicio 1212 do URI Judge.
*/

int main(int argc, char *argv[]) {
	char antes[2],str[20];
	int conv[2];
	int i;
        /*//Entrada*/
	printf ("Digite o numero(string) com dois digitos :. ");
	/*//scanf ("%c", &antes); Tentativa com scanf porque achei que era problema no gets... sem sucesso*/
	gets(antes);
        /*//Processamento*/
	for (i=0; i<2; i++){
	    /*//conv[i] = antes[i]; Tentei dessa forma mas também não funcionou*/
	    str[0]=antes[i];
	    conv[i] = atoi(str);
	}
        /*//Saida*/
	printf ("Convertido(int):. %d %d\n", conv[0],conv[1]);
	return 0;
}

 

Editado por devair1010
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas porque utilizar atoi? A função atoi seria se fosse uma string para inteiros, como você quer converter apenas cada carácter individualmente, esses caracter tem que ser transformados em códigos ascii, de uma olhada na tabela ascii: http://ic.unicamp.br/~everton/aulas/hardware/tabelaASCII.pdf

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NUMERO_PARA_NUMERO                      0       // Mude para 1 caso queira mostrar o número quando convertido

inline int chartoint(char c)
{
    if (NUMERO_PARA_NUMERO) // Caso você queira mostrar os números sem ser em código ascii
    {
        // Checa se o caracter é um número
        if (c >= '0' && c <= '9')
            return (c - '0');
    }
    return c; // Não é necessario converter o tipo, pois o compilador já faz um cast implícito
}

int main()
{
    char c[2] = { 0 };
    int toi[2] = { 0 };

    printf("Informe dois caracteres: ");
    scanf("%c%c", &c[0], &c[1]);

    for (int i = 0; i < 2; i++)
        toi[i] = chartoint(c[i]);

    printf("Convertido em int: %i %i\n", toi[0], toi[1]);
    return 0;
}

 

Editado por cyer
  • Curtir 2
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jamerson Walderson No início você tentou usar scanf, eu tentei também observe:

Code: Convertendo_com_sscanf

#include <stdio.h>
int main() {
    char str[11]= {0};      //O string que vamos capturar pela função scanf
    char Numero[10]= {0}, x;//Os caracteres do tipo char str[11] -> shot int numero[10]
    int  Soma= 0;           //A soma de todos os inteiros em Numero[10];

        scanf(" %s", str);

        x= -1;//Convertendo Tipos Char -> Short Int;
        while(EOF!= sscanf(str+x,"%1hhd", &Numero[++x])); 

        int i= -1;
        while( ++i <  x- 1){
            printf("%d+", Numero[i]);
            Soma+= Numero[i];
            }printf("%d ", Numero[i]);
            Soma+= Numero[i];
            
        printf("A soma de todos os numeros eh:= %d\n", Soma);
    return 0;

A função sscanf acredito que seja um exagero muito legal :thumbsup:, porque faz a mesma coisa que scanf só que em string.

Editado por Mauro Britivaldo
Formatação
  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
 
Em 12/01/2018 às 12:14, Mauro Britivaldo disse:

Estou viciado no URI:tw_glasses:

Acho que tenho um pouquinho de culpa nisso la daquele post que falei do URI e do The Huxley, qual quer coisa me adiciona quero acompanhar tuas questões resolvidas.

 

meu nome lá é Jamerson Walderson, minha facul é a UNESA

adicionado 2 minutos depois

@cyer

Em 12/01/2018 às 08:42, cyer disse:

Mas porque utilizar atoi?

 

 

Juro que abri a tabela ASCII antes de começar a codar porém, acho que para minha finalidade que é o código que irei postar logo em seguida não daria muito certo... esse código ai em cima era uma forma de capturar individualmente cada caractere para analisa-lo mas mesmo assim não deu muito certo kkk

adicionado 4 minutos depois

@Mauro Britivaldo

Em 12/01/2018 às 13:44, Mauro Britivaldo disse:

@Jamerson Walderson No início você tentou usar scanf, eu tentei também observe:

Code: Convertendo_com_sscanf


#include <stdio.h>
int main() {
    char str[11]= {0};      //O string que vamos capturar pela função scanf
    char Numero[10]= {0}, x;//Os caracteres do tipo char str[11] -> shot int numero[10]
    int  Soma= 0;           //A soma de todos os inteiros em Numero[10];

        scanf(" %s", str);

        x= -1;//Convertendo Tipos Char -> Short Int;
        while(EOF!= sscanf(str+x,"%1hhd", &Numero[++x])); 

        int i= -1;
        while( ++i <  x- 1){
            printf("%d+", Numero[i]);
            Soma+= Numero[i];
            }printf("%d ", Numero[i]);
            Soma+= Numero[i];
            
        printf("A soma de todos os numeros eh:= %d\n", Soma);
    return 0;

A função sscanf acredito que seja um exagero muito legal :thumbsup:, porque faz a mesma coisa que scanf só que em string.

 

Passei uns 5minutos para entender o código e acho que ainda não entendi muito bem fiquei bugado na linha que tem "while ( i++ < x -1)" kkkk

adicionado 18 minutos depois

Mestres valeu mesmo pela ajuda o motivo do post foi que esses dias tentei me aventurar em questões "mais avançadas" do URI peguei uma que achava que conseguiria fazer que é a URI 1212 pois é achava... fiquei uns dias quebrando a cabeça porque na minha lógica acreditava que seria algo parecido com o código abaixo que funcionaria.. disso senti a necessidade de usar a função atoi e fui buscar entender como ela funciona já que nunca precisei mexer com ela porém, mesmo depois de tudo mesmo depois da ajuda dos senhores o código ainda não esta funcionando e eu voltei novamente a estagnação.

 

Deve ter várias formas de fazer essa questão (e eu estou indo por uma das mais dificeis) mas no momento a minha lógica apontou para essa e é nessa que estou trabalhando pois acredito que seja funcional e que ira me dar uma boa base de conhecimento(mesmo sendo muito pra tão pouco)

 

Eu poderia simplesmente abondonar a questão mas não consigo kkkk até porque sei que a lógica dela vai servir lá na frente e se eu não souber terei problemas.

 

A questão é a seguinte Problema 1212

 

Se alguém puder me da uma luz eu agradeço pra caramba, de coração.

 

O que eu tenho até o momento é esse código aqui e é com mais ou menos isso que quero usar para resolver o problema:

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
As crianças são ensinadas a adicionar vários dígitos da direita para a esquerda, 
um dígito de cada vez.
Muitos acham a operação "vai 1" (em inglês chamada de "carry",
na qual o valor 1 é carregado de uma posição 
para ser adicionado ao dígito seguinte) 
um desafio significativo. Seu trabalho é para contar
o número de operações de carry para cada um dos problemas
de adição apresentados para que
os educadores possam avaliar a sua dificuldade.
*/

int main () {
	char 
	primeiroValor[10], //Nove números
	segundoValor[10], //Nove números
	/* Já que a função atoi não converte vetor utilizarei a var aux para fazer a conversão*/
	auxPrimeiro, 
	auxSegundo;

	int
	carry =0,
	/*Valores inteiros que serao convertidos e somados para ver e ultrapassa 10 se ultrapassar var carry recebe +1*/
	convPrimeiro[10],
	convSegundo[10],
	resultado,
	i;
	
//Entrada
	gets(primeiroValor);
	gets(segundoValor);	
	
//Processamento		
	for (i=0; i<2; i++){
		/*Parece que atoi nao funciona com vetor, então tentarei pegar individualmente cada elemento*/
		auxPrimeiro = primeiroValor[i];
		auxSegundo = segundoValor[i];
		
		convPrimeiro[i] = atoi(auxPrimeiro);
		convSegundo[i] = atoi(auxSegundo);
		resultado = convPrimeiro[i] + convSegundo[i] >= 10 ? carry++ : printf ("No carry operation.\n");
		//primeiroValor[i] >= 5 ? carry++ : printf ("No carry operation.\n");	Uma logica que também pode funcionar...
	}				
	
		
//Saida
	printf ("%d carry operations.\n", carry);
	system ("pause");
	return 0;
}

 

Obs: Perdoa a bagunça no código

adicionado 27 minutos depois

Uso o devc++ aqui esta o erro que exibe ao compilar

erro uri 1212.png

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jamerson Walderson    seu código está quase certo ,  mas ele precisa repetir até que se digite 0 0 ,  então apenas acrescentei um loop para que ele repita, e seu código com algumas modificações ficaria assim :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
As crianças são ensinadas a adicionar vários dígitos da direita para a esquerda,
um dígito de cada vez.
Muitos acham a operação "vai 1" (em inglês chamada de "carry",
na qual o valor 1 é carregado de uma posição
para ser adicionado ao dígito seguinte)
um desafio significativo. Seu trabalho é para contar
o número de operações de carry para cada um dos problemas
de adição apresentados para que
os educadores possam avaliar a sua dificuldade.
*/

int main () {
	char
	primeiroValor[10], /*//Nove números*/
	segundoValor [10], /*//Nove números*/
	/* Já que a função atoi não converte vetor utilizarei a var aux para fazer a conversão*/
	auxPrimeiro[10],
	auxSegundo[ 10];

	int
	carry =0,
	/*Valores inteiros que serao convertidos e somados para ver e ultrapassa 10 se ultrapassar var carry recebe +1*/
	convPrimeiro[10],
	convSegundo[ 10],
	resultado,
	i,u=0;

    /*//Entrada*/
    do{
        carry=0;resultado=0;
        scanf("%s%s",&primeiroValor,&segundoValor);
        /*//Processamento*/
	    for (i=strlen(primeiroValor)-1;i>=0; i--){
		    /*Parece que atoi nao funciona com vetor, então tentarei pegar individualmente cada elemento*/
		    auxPrimeiro[0] = primeiroValor[i];
            auxSegundo[ 0] = segundoValor[ i];

		    convPrimeiro[i] = atoi(auxPrimeiro);
		    convSegundo[ i] = atoi(auxSegundo );
		    if(convPrimeiro[i] + convSegundo[i]+u > 9)u=1;
		    else u=0;
		    if(u==1)carry++;
	    }
        /*//Saida*/
        if((atoi(primeiroValor) != 0) || (atoi(segundoValor) != 0))
	    if(carry==0)printf("No carry operation.\n");
        else printf("%d carry operations.\n",carry);
    }while((atoi(primeiroValor) != 0) || (atoi(segundoValor) != 0));
	return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 14/01/2018 às 20:05, Jamerson Walderson disse:

Passei uns 5minutos para entender o código e acho que ainda não entendi muito bem fiquei bugado na linha que tem "while ( i++ < x -1)" kkkk

Essa parte é só para exibir o resultado da soma," não ajuda muito no seu problema", contudo se gerou um dúvida melhor descomplicar.
 

        int i= -1;
        while( ++i <  x- 1){ //x é o limite do loop, porém reduzido em 1 para que o último
                             //valor no vetor seja ignorado. Tem outras formas de conseguir o mesmo resultado.
                             //iniciar com -1 é um preferência pessoal, gosto de (++var)pre-incremento mais 
                             //que pos-incremento(var++)
            printf("%d+", Numero[i]);
            Soma+= Numero[i];
            } 
           //Aqui está o último laço o motivo de x - 1. Para que com isso ao invés de '+' depois do número tenhamos um ' '.
            printf("%d ", Numero[i]);
            Soma+= Numero[i];

 

 x= -1;//Convertendo Tipos Char -> Short Int;
        while(EOF!= sscanf(str+x,"%1hhd", &Numero[++x])); 

O que acontece aqui é isto: x inicial com -1 será pre-incrementado no argumento &Numero[++x] assim se torna com valor 0 e depois serve de índice para o vetor: Numero[0] o mesmo x posiciona a str no incio do vetor. Desta forma apenas único caractere será gravado por vez, esse caractere se encontra na posição str[x], a cada loop continua, assim até que
str+x é o mesmo para a função que '\0' que significa o fim dos dados portanto a função retorna EOF finalizando o loop. E x agora tem o valor de inteiros carregados no vetor Numero.

 

Avaliação dos argumentos de um função acontece da direita para esquerda, ou seja, começa em &Numero[++x] e vai passando para "%1hhd" e por último até str+x, por isso quando a função pega o valor de str+x o x já foi incrementado. Logo digamos assim: Nos argumentos os últimos são os primeiros.


Em diante a vetor Numero tem todo os dígitos antes caracteres agora em tipos inteiros, exemplo: ENTRE: 1985 -> no vetor str teremos: 1985\0 pós sscanf no vetor número fica:  [0]= 1, [1]= 9, [2]= 8, [3]= 5. Digamos que eu repita as variáveis acima e tenha com uma segunda entrada de maneira a ter dois vetores números e do tipo padrão int, para isso basta mudar o formato do sscanf para "%1d" que significa d= inteiro decimal e 1= apenas um dígito decimal. 

 

Utilizei char para gravar inteiros por isso que a mascara de entrada do sscanf é 1hhd: 1 de apenas um dígito, hh de apenas 1 byte e o d de decimal.

	char 
	primeiroValor[10], //Nove números
	segundoValor[10], //Nove números
	/* Já que a função atoi não converte vetor utilizarei a var aux para fazer a conversão*/
	auxPrimeiro, 
	auxSegundo;
...
//Entrada
	gets(primeiroValor);
	gets(segundoValor);	
	
//Processamento		
	for (i=0; i<2; i++){
		/*Parece que atoi nao funciona com vetor, então tentarei pegar individualmente cada elemento*/
		auxPrimeiro = primeiroValor[i];
		auxSegundo = segundoValor[i];
		
		convPrimeiro[i] = atoi(auxPrimeiro);
		convSegundo[i] = atoi(auxSegundo);
		resultado = convPrimeiro[i] + convSegundo[i] >= 10 ? carry++ : printf ("No carry operation.\n");
		//primeiroValor[i] >= 5 ? carry++ : printf ("No carry operation.\n");	Uma logica que também pode funcionar...
	}
      ...

A função atoi precisa de um ponteiro para muitos tipos (char*)

Um vetor char é também um ponteiro de tipos char, logo só argumente vetores char. Neste caso 

auxPrimeiro e auxSegundo  

não servem:atirador:porque foram declaradas como sendo do tipo um char.

Por último inicialize tais vetores por exemplo:

auxPrimeiro[2]= {0}; //Assim [0] serve de auxilio e [1]= '\0' o que caracteriza uma string.

E para inicialização não importa o tamanho do vetor. O programa colocará 0 em toda a largura do vetor inicializado por {0}.

adicionado 21 minutos depois
#include <stdio.h>
#include <string.h>

int main() {
    char
        primeiroValor[10], //Nove números
        segundoValor[10], //Nove números

        auxPrimeiro[2]={0},
        auxSegundo[2]={0};
    int
        convPrimeiro[10],
        convSegundo[10];

    //Entrada
        gets(primeiroValor);
        gets(segundoValor);

    //Processamento
        int i, resultado, carry= 0;
        for (i=0; i<2; i++){
            auxPrimeiro[0] = primeiroValor[i];
            auxSegundo[0] = segundoValor[i];

            convPrimeiro[i] = atoi(auxPrimeiro);
            convSegundo[i] = atoi(auxSegundo);
            resultado = convPrimeiro[i] + convSegundo[i] >= 10 ?
            ++carry,printf("%d + %d YES carry operation.\n",convPrimeiro[i],convSegundo[i])
              :
            printf ("No carry operation.\n");
            //primeiroValor[i] >= 5 ? carry++ : printf ("No carry operation.\n");	Uma logica que também pode funcionar...
        }
    return 0;
    }

Assim.

adicionado 30 minutos depois

Problema é que ainda esta avaliando das dezenas -> unidades, quando deveria ser o contrário.

Ainda não cheguei neste problema, e estou seguindo a ordem da apresentação na lista, me encontro com 51% da lista inciante.

adicionado 58 minutos depois
Em 14/01/2018 às 20:05, Jamerson Walderson disse:

meu nome lá é Jamerson Walderson, minha facul é a UNESA

Acc, já Add:thumbsup:

Editado por Mauro Britivaldo
Código Fonte

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×