1

input我有一个可能包含数字的数组。我知道它将出现在数组中的哪个位置(如果确实出现了):在:. (未来的输入可能包括多个数字,每个数字都在一些文本和 a 之后:)。

我可以创建一个新数组,然后从input我的令牌开始复制到新数组,在我读取 characters 时继续0-9。然后我调用atoi新数组。

如果我能够说atoi(array, start, end)只转换包含我的数字的数组部分并消除对复制到新数组循环的需要,那会更简单一些。

我看不到任何这样的atoi函数重载。

有没有一种简单的方法可以仅将 c 样式字符串的一部分转换为不涉及我自己编写的数字atoi(const char * str, int start, int end)

4

4 回答 4

3

按照 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));
}
于 2013-04-24T11:44:38.517 回答
3

改为使用strtoul。只需使用索引调整或偏移起始地址。输出指针会让你知道解析在哪里结束。

于 2013-04-24T11:31:54.137 回答
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;
}

注意:我跳过了此类功能所需的防御性编码。

于 2013-04-24T11:31:55.323 回答
0

atoi应该可以正常工作。只需将您的起始位置(而不是整个input数组)传递给它,它就会读取尽可能多的数字。数字后的其他字符将被忽略。

于 2013-04-24T11:32:44.577 回答