токен для беззнаковой печати нечетных значений

Как следует из заголовка, я получаю некоторые странные результаты от strtoul, я протестировал, просто используя strcpy для хранения данных в виде строки, и он дает правильное значение, но как только я пытаюсь изменить его на беззнаковое целое с помощью strtoul() Я получаю странный результат и не могу найти способ его исправить. мой код выглядит следующим образом:

void loadData(TennisStoreType* ts, char* customerFile, char* stockFile) {

   FILE *customerdata;
   FILE *stockdata;
   const char *DEL = ",\n\t\r";
   CustomerNodeType newdata;
   int datapos = 0;
   char buffer[BUFFER_SIZE];
   char *remainder;
   char *token;
   char *cantload = "Can not load data from ";
   char *errorload = "Invalid data entry in ";
   char *canload = "Loading data from ";

   customerdata = fopen(customerFile, "r");
   stockdata = fopen(stockFile, "r");

   /* checks if the file can open*/
   if (customerdata == NULL) {

      fprintf(stderr, "%s%s\n", cantload, customerFile);

   } else {

      printf("%s%s\n", canload, customerFile);

      while(fgets(buffer, BUFFER_SIZE, customerdata) != NULL) {

         token = strtok(buffer, DEL);

         while(token != NULL) {

            /* this function checks weather the information is valid for
            the data position entered*/
            if (validCustData(datapos, token)) {

               /* Where abouts in the structure to load the data to*/
               switch (datapos) {
                  case 0:
                     strcpy(newdata.custID, token);
                     printf("successfully added %s in custID\n",     newdata.custID);
                 break;

                  case 1:
                     /*my own check to allow surnames to be entered over 12 characters
                     as in reality they do exist but it will only accept the first
                     12 characters and enter them into the structure

                     if (strlen(token) <= SURNAME_MAX) {
                        strcpy(newdata.surname, token);
                     } else {
                        strncpy(newdata.surname, token, SURNAME_MAX);
                        newdata.surname[SURNAME_MAX] = '\0';
                     }
                     printf("successfully added %s in surname\n", newdata.surname);
                     break; */


                      strcpy(newdata.surname, token);
                     printf("successfully added %s in surname\n", newdata.surname);
                     break;

                  case 2:
                     strcpy(newdata.firstName, token);
                     printf("successfully added %s in first name\n", newdata.firstName);
                     break;

                  case 3:
                     strcpy(newdata.address, token);
                     printf("successfully added %s in address\n", newdata.address);
                     break;

                  case 4:
                     strcpy(newdata.suburb, token);
                     printf("successfully added %s in suburb\n", newdata.suburb);
                     break;

                  case 5:
                     newdata.postCode = strtoul(token, &remainder, POSTCODE_LEN);
                     printf("successfully added %lu in postcode\n", newdata.postCode);
                     remainder = NULL;
                     break;

                  case 6:
                     newdata.phoneNum = strtoul(token, &remainder, PHONENUM_LEN);
                     printf("successfully added %lu in phone number\n", newdata.phoneNum);
                     remainder = NULL;
                     break;
               }

            } else {
               fprintf(stderr,"%s%s '%s'\n", errorload, customerFile, token);
               exit(EXIT_FAILURE);
               return;
            }


            if (datapos == DATA_POSITIONS) {
               datapos = 0;
            } else {
               datapos = datapos + 1;
            }

            token = strtok(NULL, DEL);
         }
      }
   }

   if (stockdata == NULL) {

      fprintf(stderr, "%s%s\n", cantload, stockFile);

   } else {

      /* to do */

      printf("%s%s\n", canload, stockFile);
   }
}

данные, которые загружаются, - это datapos = 5: и token = 3333: и результат, который печатается... «успешно добавлено 255 в почтовый индекс».

как указано выше, без изменения ввода и изменения случая 5: на strcpy() вместо strtoul() работает, но я не могу этого сделать, так как он не соответствует флагам -pedantic -ansi и -Wall. что ему нужно на 100%.

ps: при необходимости POSTCODE_LEN определяется как 4, и я включил как stdlib.h, так и string.h


person Rory Thoman    schedule 16.02.2015    source источник
comment
Кажется, вам не нужно значение remainder, поэтому вы можете просто передать NULL в качестве второго аргумента strtoul.   -  person Frerich Raabe    schedule 16.02.2015
comment
В настоящее время это просто для того, чтобы поймать, есть ли нечисловые символы, которые мне понадобятся когда-нибудь в будущем. высока вероятность того, что я удалю и поменяю на NULL, спасибо за вклад.   -  person Rory Thoman    schedule 16.02.2015


Ответы (1)


Третьим аргументом strtoul является не длина строки (всегда использовалась вся строка), а основание счисления (он же основание счисления). Попробуйте передать 10 вместо 4.

person racraman    schedule 16.02.2015
comment
Незначительная придирка: strtoul не обязательно использует всю строку, она использует только строку до первого нечислового символа (поэтому для нее есть аргумент end pointer: так что вы можете выяснить, можно ли проанализировать всю строку как число). - person Frerich Raabe; 16.02.2015
comment
Большое спасибо! Я прочитал библиотеку strtoul(), но неверно истолковал это, теперь это имеет большой смысл, я знал, что это что-то крошечное, на 100% работающее, вы меня очень порадовали :) - person Rory Thoman; 16.02.2015