通过字符串迭代并在数组中存储数字

时间:2017-08-20 12:55:50

标签: c string token

我喜欢遍历字符串1.3.6.1.2.1.2.2.1.10.1并将所有数字存储在数组中。我的代码适用于0-9之间的数字,但不适用于大于9的数字,因为我只迭代一步并扫描数字。如何存储所有数字,而不是像我当前的输出:1 3 6 1 2 1 2 2 1 10 0 1(没有换行符)?

int main(int argc, char *argv[])
{
    //char * string = "1.3.6.1.2.1.2.2.1.9.1"; /* OK */
    char * string = "1.3.6.1.2.1.2.2.1.10.1"; /* NOK */
    static int oid_val_arr[256];
    char *oid_tmp = string;
    int idx = 0;
    while (*oid_tmp)
    {
        int number;
        if (sscanf(oid_tmp, "%d", &number) == 1)
        {
            oid_val_arr[idx] = number;
            idx++;
        }
        oid_tmp++; /* PROBLEM */
    }

    for(int i = 0; i < 12; i++)
        printf("%d\n", oid_val_arr[i]);
}

我应该使用strtok()吗?

2 个答案:

答案 0 :(得分:0)

在您的代码中,更改此内容:

if(sscanf(oid_tmp, "%d", &number) == 1)

到此:

if(sscanf(oid_tmp, "%d%n", &number, &len) == 1)

也是为了获得长度。那么你当然需要改变你的while循环:

while (*oid_tmp)
{
    int number;
    int len;
    if(sscanf(oid_tmp, "%d%n", &number, &len) == 1)
    {
        oid_val_arr[idx++] = number;
        oid_tmp += len;
    }
    else
    {
        ++oid_tmp;
    }
}

正如BLUEPIXY所说。

另一种方法是使用strtok()atoi(),如下所示:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SIZE 11

int main ()
{
  int arr[SIZE], i = 0; 
  char str[] ="1.3.6.1.2.1.2.2.1.10.1";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str,".");
  while (pch != NULL)
  {
    //printf ("%s\n",pch);
    arr[i++] = atoi(pch);
    pch = strtok (NULL, ".");
  }
  for(i = 0; i < SIZE; ++i)
      printf("%d ", arr[i]);
   printf("\n");
  return 0;
}

输出:

Splitting string "1.3.6.1.2.1.2.2.1.10.1" into tokens:
1 3 6 1 2 1 2 2 1 10 1

答案 1 :(得分:0)

或代替strtok

函数忽略数字之间的多个分隔符。

int stringToIntArray(const char *string, char *separators, int *table, size_t tablesize, int ignoreinvalid)
{
    int result = (string == NULL || separators == NULL || table == NULL || !tablesize) * -1;
    char tmpbuff[50];
    char *tmpptr;
    int invalid = 0;


    if (!result)
    {
        while (*string)
        {
            invalid = 0;
            tmpptr = tmpbuff;
            while (*string && strchr(separators, *string) != NULL)  string++;
            while (*string && strchr(separators, *string) == NULL)
            {
                if (isdigit(*string)) *tmpptr++ = *string;
                else
                {
                    if (ignoreinvalid == 1)
                    {
                        invalid = 1;
                        break;
                    }
                    if (ignoreinvalid == 2)
                    {
                        result = -1;
                        break;
                    }
                }
                *string++;
            }
            if (result != -1)
            {
                if (invalid)
                {
                    while (*string && strchr(separators, *string) == NULL) string++;
                }
                else
                {
                    *tmpptr = '\0';
                    if (!strlen(tmpbuff)) break;
                    table[result++] = atoi(tmpbuff);
                    if (result == tablesize) break;
                }
            }
            else break;
        }
    }
    return result;
}

用法:

int ar [11];

int cnt = stringToIntArray("123,:0dddd3:0:;456", ",:;", &ar, 11, 0);

最后一个参数 - 0只是忽略无效符号,1忽略数字,2则中断扫描错误。返回找到的数字的标识符或错误的-1