正如标题所示,我从strtoul得到了一些奇怪的返回,我只是通过使用strcpy将数据存储为字符串进行了测试,它给出了正确的值,但是一旦我尝试使用strtoul()将其更改为无符号int,我就会得到一个奇怪的结果,并且找不到修复它的方法。我的代码如下:

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。
如上所述,如果不更改输入并将case 5:改为strcpy()而不是strtoul()就可以工作,但我不能这样做,因为它不遵循-pedantic-ansi和-Wall标志。它需要100%。
备注:如果需要,邮政编码是4,我已经包括了stdlib.h和string.h

最佳答案

strtoul的第三个参数不是字符串长度(我们经常使用的整个字符串),而是数字基数(也称为基数)。试着传10分而不是4分。

关于c - token 到无符号打印奇数值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28537022/

10-11 21:19