fscanf retorna 1 se conseguir ler uma string, e 0 ou menor que 0, em caso contrário, certo?
E pq meu código trava quando uso
ao invés de
fscanf retorna 1 se conseguir ler uma string, e 0 ou menor que 0, em caso contrário, certo?
E pq meu código trava quando uso
ao invés de
Quando você faz:
while(fscanf(f, "%s", str))
e fscanf encontra o final do arquivo, ele retorna EOF, que é um valor diferente de 0. Como o while entende que true = diferente de zero, e false = zero, então ele vai realmente ficar travado.
Use “while (fscanf (…) > 0)” e pare de inventar coisas. Não há absolutamente nenhuma diferença, em termos de CPU, entre a comparação para saber se é positivo ou se é diferente de zero.
Em C ou C++ evite a todo custo fazer este tipo de comparação:
“while (alguma coisa == true)” / “if (alguma coisa == true)”
ou
“while (alguma coisa == false)” / “if (alguma coisa == false)”.
Isso é porque esse “alguma coisa” pode retornar 0 (que é FALSE mesmo) ou então alguma coisa que não é zero (em C e C++, o “if” e o “while” entendem como true).
É melhor usar:
while (alguma coisa)
if (alguma coisa)
e
while ( ! alguma coisa)
if ( ! alguma coisa)
Lembrem-se de deixar espaços na frente e atrás do “!” para que ele fique bem destacado.
Mais um detalhinho, se você realmente precisa de 0 = false e 1 = true, pode usar este truque:
int valorBooleano = !! algumacoisa();
!! transforma 0 (FALSE) em 0 mesmo, e qualquer coisa diferente de 0 em 1 (TRUE).
ih, manim… eu pensava que valores menores que 0 eram considerados FALSE tb.
vlw pelas dicas, especialmente a de destacar os !
essa de usar !! eu não entendi… :XD:
explica mais?
Pois é. Um ! transforma o 0 em 1, e qualquer coisa que não é 0 em 0.
Quando você encadeia dois ! !, então você tem algo assim:
! 0 -> 1
!! 0 -> ! 1 -> 0
! 1 -> 0
! 2 -> 0
! (-20) -> 0
! ! 1 -> ! 0 -> 1
! ! 2 -> ! 0 -> 1
! ! (-20) -> ! 0 -> 1
OK?
ih, manim… eu pensava que valores menores que 0 eram considerados FALSE tb.
Em uma linguagem muito famosa (VB) o valor FALSE é 0, mas o valor TRUE é (-1), que é menor que 0. Esquisito, não? Mas é verdade.