gpt4 book ai didi

c - strtok 和段错误的问题

转载 作者:太空狗 更新时间:2023-10-29 17:20:10 26 4
gpt4 key购买 nike

我有两个辅助函数来分解十进制价格格式的字符串,即。 "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);
}

最佳答案

因为 strtok() 修改了输入字符串,当您调用 getDollars 后它无法在 getCents() 函数中找到分隔符时,您会遇到问题()

请注意,strtok() 在找不到分隔符时会返回一个空指针。您的代码不会检查 strtok() 是否找到了它要查找的内容 - 这总是有风险的。


您对问题的更新表明您至少了解了 strtok() 的一些危险(邪恶?)。但是,我建议更好的解决方案是仅使用 strchr()

首先,我们可以观察到 atoi() 无论如何都会在 '.' 处停止转换,因此我们可以简化getDollars() 到:

unsigned getDollars(const char *price)
{
return(atoi(price));
}

我们可以使用 strchr() - 它不会修改字符串 - 找到 '.' 然后处理它后面的文本:

unsigned getCents(const char *price)
{
const char *dot = strchr(price, '.');
return((dot == 0) ? 0 : atoi(dot+1));
}

我认为要简单得多。


还有一个陷阱:假设字符串是 26.6;你将不得不比上面修改后的 getCents() 更努力地让它返回 60 而不是 6。另外,给定 26.650,它将返回 650,而不是 65。

关于c - strtok 和段错误的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5925405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com