Digitalização, verificação, conversão, copiando valores ... como? -c -
Pergunta
Já faz um tempo agora e ainda estou tentando obter um determinado código para funcionar. Fiz algumas perguntas sobre diferentes comandos etc. antes, mas agora espero que este seja o final (combinando todas as perguntas em um código).
Eu basicamente quero:
*Digitalizar uma entrada (deve ser personagem?)
*Verifique se é um número
*Caso contrário, retorne o erro
*Converta esse personagem em um número de flutuação
*Copie o valor para outra variável (eu chamei de IMP aqui)
Aqui está o que eu criei:
Código editado*
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
main(){
int digits;
float imp=0;
char* alpha;
do{
printf("Enter input\n\n");
scanf("\n%c",alpha);
digits=isdigit(alpha);
if(digits==0){
printf("error\n\n");
}
imp=atof(alpha);
}while(digits==0);
}
O problema é que esse código não funciona ... me dá que o ATOF deve ter um char const e sempre que eu tento alterá -lo, ele continua falhando. Estou frustrado e forçado a perguntar aqui, porque acredito que tentei muito e continuo falhando, mas não ficarei aliviado até que eu funcione XD, então preciso realmente da sua ajuda pessoal.
Por favor, diga -me por que esse código não está funcionando, o que estou fazendo de errado? Ainda estou aprendendo C e realmente aprecio sua ajuda :)
EDITARO erro dado atm é:
Argument no 1 of 'isdigit' must be of type 'const int', not '<ptr>char'
EDITAREsse código compila bem, mas trava quando uma entrada é inserida.
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
main(){
int digits;
float imp=0;
char* alpha=0;
do{
printf("Enter input\n\n");
scanf("\n%s",alpha);
digits=(isdigit(alpha[0]));
imp=atof(alpha);
}while(digits==0);
}
Solução
Por que não ter scanf fazer o atof
conversão para você?
#include <stdio.h>
int main()
{
float imp=0;
while (1)
{
printf("Enter input\n\n");
if (scanf("%f", &imp) < 1) break;
}
return 0;
}
Seu exemplo mais recente está falhando porque alpha
é um ponteiro nulo. Declarar como char alpha[40];
Para alocar espaço para isso. Você provavelmente vai querer usar %40s em sua sequência de formato para evitar scanf
de transbordar alpha
.
Além disso, use strtod
ao invés de atof
E você saberá se a conversão foi bem -sucedida (melhor do que o seu método de usar isdigit
que falhará em um número inteiro negativo).
Outras dicas
Você provavelmente precisa usar %s
ao invés de %c
E para colocá -lo char
variedade (char*
). Você provavelmente também recebe um erro que precisa usar const char*
e não const char
.
Você não quer ler apenas um personagem - você quer ler uma string inteira ...
EDITAR:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
main(){
int digits,i;
float imp=0;
char* alpha = malloc(100); /* 100 is for example */
do{
printf("Enter input\n\n");
scanf("\n%s",&alpha);
for (i = 0; i != 100; ++i)
{
if (alpha[i] == '\0')
break;
if (!isdigit(alpha[i]))
{
printf("error\n\n");
return ...;
}
}
imp=atof(alpha);
}while(true);
}