我有一个数组input
,可能包含一个数字。我知道它将出现在数组中的哪个位置(如果确实出现):在:
之后。 (未来的输入可能包括多个数字,每个数字在一些文本和:
之后)。
我可以创建一个新数组,然后从input
复制到从我的令牌开始的新数组,继续读取字符0-9
。然后我在新阵列上调用atoi
。
如果我能够说atoi(array, start, end)
,只转换包含我的数字的数组部分并且不需要复制到新数组循环,那会更简单一些。
我看不到atoi
function的任何超载。
是否有一种简单的方法可以将一部分c风格的字符串转换为一个不涉及我自己编写atoi(const char * str, int start, int end)
的数字?
答案 0 :(得分:3)
请改用strtoul
。只需使用索引调整或偏移起始地址即可。输出指针将告诉您解析结束的位置。
答案 1 :(得分:2)
根据D.Shawley的建议使用strtoul,您可以执行以下操作:
<强>代码强>
char* str = ":12 sdfsdf :45:18";
char* p = str;
while (*p)
{
if (*p++ == ':')
printf("%d\n", strtoul(p, &p, 10));
}
<强>输出强>
12
45
18
atoi版
也可以使用atoi(codepad):
char* str = ":12 sdfsdf :45:18";
char* p = str;
while (*p)
{
if (*p++ == ':')
printf("%d\n", atoi(p));
}
答案 2 :(得分:0)
不,我不知道这样的功能。
C中也没有超载。
但是,编写自己的atoi并不困难。
int atoi_se(const char * str, int start, int end) {
char* startPtr = str+start;
char* endPtr = str+end;
char savedChr = *endPtr;
*endPtr = '\0';
int retVal = strtol(startPtr, NULL, 10);
*endPtr = savedChr;
return retVal;
}
注意:我跳过了这种功能所需的防御性编码。
答案 3 :(得分:0)
atoi
应该可以正常工作。只需将它的起始位置(而不是整个input
数组)传递给它,它将尽可能多地读取数字。数字后面的其他字符将被忽略。