将部分c样式字符串转换为int

时间:2013-04-24 11:28:06

标签: c

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

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

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

我看不到atoi function的任何超载。

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

4 个答案:

答案 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

See the codepad

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数组)传递给它,它将尽可能多地读取数字。数字后面的其他字符将被忽略。