C:如何将一串int转换为实际的int并将它们存储在一个数组中?

时间:2010-03-11 19:13:20

标签: c string

我有一个字符串"14 22 33 48"。我需要将字符串中的每个值插入到数组中的相应位置:

int matrix[5];

这样

matrix[0] = 14;
matrix[1] = 22;
matrix[2] = 33;
matrix[3] = 48;

我该怎么做?

4 个答案:

答案 0 :(得分:8)

您可以使用sscanf

sscanf(val, 
       "%d %d %d %d", 
       &matrix[0], 
       &matrix[1], 
       &matrix[2], 
       &matrix[3]
);

答案 1 :(得分:5)

const char *p = input;
int i = 0, len;
while (i < sizeof(matrix)/sizeof(matrix[0]) 
   && sscanf(p, "%d%n", &matrix[i], &len) > 0) {
    p += len;
    i++;
}

为了获得额外的功劳,动态重新分配矩阵使其达到需要的大小......

答案 2 :(得分:2)

我建议strtol,它提供比atoisscanf更好的错误处理。如果遇到错误的字符或数组中的空间不足,此版本将停止。当然,如果字符串中没有足够的整数来填充数组,那么其余部分将保持未初始化状态。

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

#define ARRAY_SIZE 5

int main(int argc, char *argv[])
{
   /* string to convert */
   const char * str = "14 22 33 48";

   /* array to place converted integers into */
   int array[ARRAY_SIZE];

   /* this variable will keep track of the next index into the array */
   size_t index = 0;

   /* this will keep track of the next character to convert */
   /* unfortunately, strtol wants a pointer to non-const */
   char * pos = (char *)str;

   /* keep going until pos points to the terminating null character */
   while (*pos && index < ARRAY_SIZE)
   {
      long value = strtol(pos, &pos, 10);

      if (*pos != ' ' && *pos != '\0')
      {
         fprintf(stderr, "Invalid character at %s\n", pos);
         break;
      }

      array[index] = (int)value;
      index++;
   }
}

答案 3 :(得分:1)

C语言中的强健字符串处理绝非易事。

这是一个让我立即想到的程序。使用strtok()将字符串分解为单个标记,然后使用strtol()将每个标记转换为整数值。

需要注意的事项:strtok()修改其输入(在分隔符上写0)。这意味着我们必须传递一个可写字符串。在下面的示例中,我动态创建一个缓冲区来保存输入字符串,然后将该动态缓冲区传递给strtok()。这可以保证strtok()在可写内存上运行,作为奖励,我们会保留输入,以备日后需要时使用。

此外,strtol()允许我们捕捉到错误形成的输入;第二个参数将指向转换的字符串中的第一个字符。如果该字符不是空格或0,那么该字符串不是有效的整数,我们可以在将它分配给目标数组之前拒绝它。

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

/**
 * Convert a space-delimited string of integers to an array of corresponding
 * integer values.
 *
 * @param str     [in]  -- input string
 * @param arr     [in]  -- destination array
 * @param arrSize [in]  -- max number of elements in destination array
 * @param count   [out] -- number of elements assigned to destination array
 */
void stringToIntList(char *str, int *arr, size_t arrSize, size_t *count)
{
  /**
   * The token variable holds the next token read from the input string
   */
  char *token;

  /**
   * Make a copy of the input string since we are going to use strtok(),
   * which modifies its input.
   */
  char *localStr = malloc(strlen(str) + 1);
  if (!localStr)
  {
    /**
     * malloc() failed; we're going to treat this as a fatal error
     */
    exit(-1);
  }
  strcpy(localStr, str);

  /**
   * Initialize our output
   */
  *count = 0;

  /**
   * Retrieve the first token from the input string.
   */
  token = strtok(localStr, " ");
  while (token && *count < arrSize)
  {
    char *chk;
    int val = (int) strtol(token, &chk, 10);
    if (isspace(*chk) || *chk == 0)
    {
      arr[(*count)++] = val;
    }
    else
    {
      printf("\"%s\" is not a valid integer\n", token);
    }

    /**
     * Get the next token
     */
    token = strtok(NULL, " ");
  }

  /**
   * We're done with the dynamic buffer at this point.
   */
  free(localStr);
}

int main(void)
{
  int values[5];
  char *str = "14 22 33 48 5q";
  size_t converted;

  stringToIntList(str, values, sizeof values / sizeof values[0], &converted);

  if (converted > 0)
  {
    size_t i;
    printf("Converted %lu items from \"%s\":\n", (unsigned long) converted, str);
    for (i = 0; i < converted; i++)
      printf("arr[%lu] = %d\n", (unsigned long) i, arr[i]);
  }
  else
  {
    printf("Could not convert any of \"%s\" to equivalent integer values\n", str);
  }

  return 0;
}