2011-10-16 4 views
0

400000000000; 499999999999; VISA;tableaux de txt en c (chiffres longs)

50000000; 59999999; MASTERCARD;

67000000; 67999999; MAESTRO;

champs: 1. Début de plage 2. Fin de plage, 3 Nom.

Les champs [Plage de début] et [Plage de fin] peuvent avoir une longueur de 1 à 16 caractères (chiffres).

L'objectif du programme est le suivant:

Première demande d'entrer le numéro de carte à 16 chiffres.

Card number input, verification and processing use char [n] type (Simbol array) 

Deuxièmement: Vérifier une entrée correspondant au numéro de carte entré se trouvent dans un fichier texte si j'entre 45.000.000.000 il est entre 400000000000 et 499999999999 donc je dois mettre un texte dans un nom de autput VISA. Et je ne peux pas utiliser de longs types ... comme je ne peux pas utiliser des tableaux ... Troisième Demande d'entrer le montant au format "nnnn.mm", où nnnn-1 à 4 chiffres lats, mais mm - nombre de santims à 2 chiffres.

char input[32]; // = "100;200;first"; 
char name[10]; 
int min, max, c, i, k; 

FILE *file; 
file = fopen("gg.txt","r"); 

i=0; 

while ((c=getc(file))!= EOF) 
{ 
    k=(int)c; 
    input[i]=k; 
    i++; 
} 

char* result = NULL; 
char delims[] = ";"; 

result = strtok(input, delims); 

// atoi() converts ascii to integer. 
min = atoi(result); 
result = strtok(NULL, delims); 
max = atoi(result); 

result = strtok(NULL, delims); 

strcpy(name, result); 

printf("Min=%d, Max=%d, Name=%s\n", min, max, name); 
printf("input=%s\n",input); 
printf("%d\n",i); 

getch(); 
return 0; 

ce code qui m'a été donnée par varunl fonctionne Vith numéros Smal (le contenant du fichier gg.txt est la suivante: 100, 200, premier), mais un besoin smt autre, enybody, peut me aider?

+0

long atol (const char * S); –

+0

Dupliquer (ish) d'une question antérieure: http://stackoverflow.com/questions/7784679/reading-and-comparing-numbers-from-txt-file-c –

Répondre

2

L'astuce consiste à remplir les chiffres à 16 chiffres, de sorte que vous pouvez les comparer en tant que chaînes. Donc, si vous lisez ceci: vous devez considérer comme

67000000;67999999;MAESTRO; 

en réalité ceci:

0000000067000000;0000000067999999;MAESTRO; 

Même chose pour l'entrée utilisateur.

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

void FindCCType(const char *pnumber); 

int main(int argc, char *argv[]) 
{ 
    FindCCType("67000001"); 
    return 0; 
} 

#define MAXLENGTH 16 

char* PadLeft(const char *pnumber) 
{ 
    char *pnumber2 = (char*)malloc(MAXLENGTH + 1); 
    size_t len = strlen(pnumber); 

    if (len > MAXLENGTH) 
    { 
     /* Too many digits in credit card number */ 
     exit(1); 
    } 

    strcpy(pnumber2 + MAXLENGTH - len, pnumber); 

    char *pbegin = pnumber2, *plast = pnumber2 + MAXLENGTH - len; 

    while (pbegin < plast) 
    { 
     *pbegin = '0'; 
     pbegin++; 
    } 

    return pnumber2; 
} 

void FindCCType(const char *pnumber) 
{ 
    printf("Input: %s\n", pnumber); 

    char *pnumber2 = PadLeft(pnumber); 

    FILE *file = fopen("gg.txt","r"); 

    char pline[1000]; 

    while (fgets(pline, sizeof(pline), file) != NULL) 
    { 
     if (strlen(pline) + 1 == sizeof(pline)) 
     { 
      /* Line too much long */ 
      exit(2); 
     } 

     char *pmin = strtok(pline, ";"); 
     char *pmax = strtok(NULL, ";"); 
     char *pname = strtok(NULL, ";"); 

     printf("Min: %s, Max: %s, Name: %s", pmin, pmax, pname); 

     char *pmin2 = PadLeft(pmin); 
     char *pmax2 = PadLeft(pmax); 

     if (strcmp(pnumber2, pmin2) >= 0 && strcmp(pnumber2, pmax2) <= 0) 
     { 
      printf(" ** FOUND **\n"); 

      free(pmin2); 
      free(pmax2); 
      break; 
     } 

     printf(" ** NO GOOD **\n"); 

     free(pmin2); 
     free(pmax2); 
    } 

    fclose(file); 
    free(pnumber2); 
} 
+0

Je ne peux pas utiliser de longs types longs – eduard

+0

@edGGars Quel compilateur Utilises-tu? – xanatos

+0

Je suis nouveau à C et je compile avec le compilateur DEV-C++ de deafoult, mais J'ai la tâche que je ne peux pas utiliser de longs types longs ... – eduard