我有两个辅助函数,用于分解十进制价格格式的字符串,例如“23.00”,“2.30”。
考虑以下内容:
现在当我运行下面的代码时,会出现分段错误:
考虑以下内容:
char price[4] = "2.20";
unsigned getDollars(char *price)
{
return atoi(strtok(price, "."));
}
unsigned getCents(char *price)
{
strtok(price, ".");
return atoi(strtok(NULL, "."));
}
现在当我运行下面的代码时,会出现分段错误:
printf("%u\n", getDollars(string));
printf("%u\n", getCents(string));
然而,当我分别运行它们而不是一个接一个地运行时,它们可以正常工作。我错过了什么?我需要重置strtok吗?
我的解决方案:
根据我从下面选择的答案所获得的关于strtok的知识,我改变了辅助函数的实现方式,这样它们首先复制传递进来的字符串,从而保护原始字符串并防止出现这个问题:
#define MAX_PRICE_LEN 5 /* Assumes no prices goes over 99.99 */
unsigned getDollars(char *price)
{
/* Copy the string to prevent strtok from changing the original */
char copy[MAX_PRICE_LEN];
char tok[MAX_PRICE_LEN];
/* Create a copy of the original string */
strcpy(copy, price);
strcpy(tok, strtok(copy, "."));
/* Return 0 if format was wrong */
if(tok == NULL) return 0;
else return atoi(tok);
}
unsigned getCents(char *price)
{
char copy[MAX_PRICE_LEN];
char tok[MAX_PRICE_LEN];
strcpy(copy, price);
/* Skip this first part of the price */
strtok(copy, ".");
strcpy(tok, strtok(NULL, "."));
/* Return 0 if format was wrong */
if(tok == NULL) return 0;
else return atoi(tok);
}