【问题标题】:Convert char array to int array?将char数组转换为int数组?
【发布时间】:2011-11-09 17:10:01
【问题描述】:

我是 C 的初学者。 我有一个这种格式的字符数组,例如“12 23 45 9”。 如何将其转换为 int 数组 {12,23,45,9}? 提前致谢。

【问题讨论】:

    标签: c arrays string int


    【解决方案1】:

    在循环中使用sscanfstrtol

    【讨论】:

    • 是的,但是它将我的数组拆分为{1,2,3,4,5,9}并继续循环。如何结束循环?
    • 展示你所拥有的以便修复它。
    【解决方案2】:

    您将需要 stdlib.h

    //get n,maxDigits
    char** p = malloc(sizeof(char*) * n);
    int i; 
    for(i=0;i<n;i++)
    p[i] = malloc(sizeof(char) * maxDigits);
    
    //copy your {12,23,45,9}  into the string array p, or do your own manipulation to compute string array p.
    
    int* a = malloc(sizeof(int) * n);
    int i;         
    for(i=0;i<n;i++)
    a[i] = atoi(p[i]);
    

    【讨论】:

      【解决方案3】:

      您可以使用以下技术计算单个数字(但它不会将它们转换为整数):

      请注意,我正在使用 int 迭代循环使其可读。通常你只需要增加 char 指针本身:

      void PrintInts(const char Arr[])
      {
          int Iter = 0;
          while(Arr[Iter])
          {
              if( (Arr[Iter] >= '0') && (Arr[Iter]) <= '9')
              {
                  printf("Arr[%d] is: %d",Iter, (Arr[Iter]-'0') );
              }
          }
          return;
      }
      

      上面将通过减去 0-9 集合的最低 ASCII 表示形式将 ASCII 数字转换回 int 数字。因此,例如,如果“0”由 40 表示(不是),而“1”由 41 表示(不是),则 41-40 = 1。

      要得到你想要的结果,你要使用 strtok 和 atoi:

      //Assumes Numbers has enough space allocated for this
      int PrintInts(const int Numbers[] const char Arr[])
      {
          char *C_Ptr = strtok(Arr," ");
          int Iter = 0;
          while(C_Ptr != NULL)
          {
              Numbers[Iter] = atoi(C_Ptr);
              Iter++;
              C_Ptr = strtok(NULL," ");
          }
          return (Iter-1); //Returns how many numbers were input
      }
      

      【讨论】:

        【解决方案4】:

        怎么样:

        const char *string = "12 23 45 9";
        int i, numbers[MAX_NUMBERS];         //or allocated dynamically
        char *end, *str = string;
        for(i=0; *str && i<MAX_NUMBERS; ++i)
        {
            numbers[i] = strtol(str, &end, 10);
            str = end;
        };
        

        如果字符串在最后一个数字之后有空格,则可能会在数字数组中得到一个尾随的 0。

        【讨论】:

          【解决方案5】:

          传统但已弃用的方法是使用strtok()。现代替代品是strsep()。这是strsep() 的手册页上的一个示例:

          char **ap, *argv[10], *inputstring;
          
          for (ap = argv; (*ap = strsep(&inputstring, " \t")) != NULL;)
              if (**ap != '\0')
                  if (++ap >= &argv[10])
                      break;
          

          使用提供的分隔符(空格、制表符)将输入字符串分解为多个片段并遍历这些片段。您应该能够修改上述内容以使用 atoi() 将每个部分转换为 int。 strsep() 的主要问题是它修改了输入字符串,因此不是线程安全的。

          如果您知道输入字符串将始终包含相同数量的整数,另一种方法是使用sscanf() 一次性读取所有整数:

          char *input = "12 23 45 9";
          int output[5];
          
          sscanf(inputstring, "%d %d %d %d %d", &output[0], &output[1], &output[2], &output[3], &output[4]);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-02
            • 2013-12-11
            • 1970-01-01
            • 2020-11-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多