【发布时间】:2015-02-16 08:11:10
【问题描述】:
正如标题所暗示的,我从 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: 并且正在打印的结果是......“在邮政编码中成功添加了 255”。
如上所述,在不更改输入和更改案例 5:到 strcpy() 而不是 strtoul() 的情况下,但我不能这样做,因为它不遵循标志 -pedantic -ansi 和 -Wall。它需要 100%。
ps:如果需要,POSTCODE_LEN 定义为 4,我已经包含了 stdlib.h 和 string.h
【问题讨论】:
-
看来你不需要
remainder的值,所以你可以把NULL作为第二个参数传递给strtoul。 -
如果有非数字字符,它现在就在那里捕获,只是封装我将来需要的某个时间。虽然我会删除并更改为 NULL,但很有可能,但感谢您的输入。
标签: c struct token strtol strtoull