Stack Overflow em Português Asked by Fábio Morais on January 27, 2021
Estou a ter uns problemas a ler um numero inicializado com long long
long long valid;
scanf("%lli", &valid);
INPUT:
025
A variavel valid
vai ter como conteúdo 21
e não 25
Se eu mudar de %lli
para %llu
isso já corrige o problema, mas não percebo o porquê, aliás, ao usar %llu
deveria de ser para unsigned long long
e não para long long
.
Como corrigir isso? Terei obrigatoriamente de mudar para %llu
?
Porque acontece isso quando escrevemos um numero começando com 0
?
Se quiser ignorar o zero deve ler de forma obrigatoriamente decimal, e isto se dá usado o %d
, e por ser um long long
de ser %lld
:
#include <stdio.h>
int main(void) {
long long valid;
scanf("%lld", &valid);
printf("%lld", valid);
}
Veja funcionando no ideone. E no repl.it. Também coloquei no GitHub para referência futura.
O %lli
diz que quer um número, não importa a notação digitada, e quando começa com zero ele entende que é octal. Em quase todos os casos o %i
é erro.
Mas se quer o 0
mesmo antes mesmo aí é diferente.
Vou repetir mais um vez, número é número. Então a matemática define que zero à esquerda não tem significado, por isso ele é ignorado.
Se deseja ler um zero à esquerda de forma significativa não está querendo ler um número, está querendo ler um texto que possui dígitos numéricos. São conceitos completamente diferentes. Se deseja isto mesmo, então mande ler um char *
com %s
, aí pode por 0
onde quiser.
Correct answer by Maniero on January 27, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP