Как следует из заголовка, я получаю некоторые странные результаты от 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
remainder
, поэтому вы можете просто передатьNULL
в качестве второго аргументаstrtoul
. - person Frerich Raabe   schedule 16.02.2015