2017-07-30 23 views
0

J'essaye de faire une boucle do-while. J'essaie d'obtenir l'entrée de l'utilisateur tant que la longueur de l'entrée de l'utilisateur est inférieure à 13 chiffres ou supérieure à 16 chiffres.Pourquoi est-ce que je ne ferai pas d'arrêt de boucle en boucle?

Exemple:
1234 (4 chiffres) irait le do while encore,
123493919295919 (14 chiffres) arrêterait la boucle.

#include <cs50.h> 
#include <stdio.h> 
#include <math.h> 

int main(void) 
{ 
    int n; 
    int nDigits; 
    do 
    { 
     n = get_int("Please enter your credit card number:\n"); 
     nDigits = floor(log10(abs(n))) + 1; 
    } 
    while (nDigits < 13 || nDigits > 16); 
} 
+2

'int's ne peut probablement même pas contenir 14 chiffres sur votre installation. – user2357112

+3

Un numéro de carte de crédit est généralement une chaîne, pas un int. Imaginez que votre numéro de carte de crédit commence par zéro et vous êtes condamné. – Fabien

+0

N'utilisez pas 'get_int()'. Écrivez votre propre fonction. Vous ne pouvez rien faire pour réparer votre programme tant que vous utilisez cette fonction. – m0h4mm4d

Répondre

1

Qu'est-ce que int dans votre système? Est-ce 4 octets (32 bits)?

nDigits pour le type int, qui a 32 bits, sera toujours inférieur à 11 (je veux dire que INT_MAX qui est égale à 2147483647 donne juste 10), si la condition est vraie (car (nDigits < 13 || nDigits > 16) donne true OR false, qui est true). Par conséquent, envisagez de changer de type pour la représentation des données.

Options:

  1. char[17] pour stocker des chaînes jusqu'à 16 caractères (à l'intérieur chaîne vous pouvez vérifier que tous les caractères sont des chiffres, voir isdigit)
  2. uint64_t forme <stdint.h> (il semble y avoir aucun numéro de carte négative
1

Vous devez prendre le numéro de carte de crédit sous la forme d'une chaîne et non d'un int.

Le CS50 Documentation de référence est assez clair que:

get_int() lit une ligne de texte à partir de l'entrée standard et le renvoie sous un entier dans la plage de [-2^31 + 1, 2^31 - 2], si possible; Si le texte ne représente pas un tel int, l'utilisateur est invité à réessayer. Les espaces de début et de fin sont ignorés. Pour des raisons de simplicité, le dépassement de capacité n'est pas détecté . Si la ligne ne peut pas être lue, renvoie INT_MAX.

Comme indiqué par @VolAnd, ce termine en une signé int32 qui a toujours moins de 11 chiffres et pourrait même être négatif ...

0

J'ai changé les ints des positions longues et il fonctionne. C'est ce que cs50 veut que nous utilisions. Merci pour l'aide à tout le monde!