正如标题所示,我从strtoul获得了一些奇怪的回报,我只是通过使用strcpy将数据存储为字符串并且它给出正确的值来测试,但是一旦我尝试将其更改为无符号int使用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:并且正在打印的结果是......&#34;在邮政编码中成功添加了255&#34;。
如上所述,在不更改输入和更改大小写5的情况下:strcpy()而不是strtoul()可以工作,但我不能这样做,因为它不遵循标志-pedantic -ansi和-Wall。它需要100%。
ps:如果需要,POSTCODE_LEN被定义为4,我已经包含了stdlib.h和string.h
答案 0 :(得分:2)
strtoul的第三个参数不是字符串长度(我们总是使用整个字符串) - 但是数字基数(也就是基数)。尝试传入10而不是4。