我有这样初始化的字符串数组:

char ** strArray;

if ( (strArray = malloc(sizeof(*strArray) + 3)) == NULL ) {
    fprintf(stderr, "ls1: couldn't allocate memory");
    //exit(EXIT_FAILURE);
}
strArray[0] = NULL;

strArray[0] = "111";
strArray[1] = "222";
strArray[2] = "1";
strArray[3] = "2";


我想将此字符串数组转换为int数组,如下所示:

int * toIntArray(char ** strArray) {

int size = getCharArraySize(strArray);
int intArray[size];
int i;

for ( i = 0; i < size  ; ++i)
{
   intArray[i] = atoi(strArray[i]);
   printf( "r[%d] = %d\n", i, intArray[i]);

}
intArray[size] = '\0';
return intArray;


}

int getCharArraySize(char ** strArray) {
  int s = 0;
  while ( strArray[s]) {
        printf("Char array: %s.\n", strArray[s]);
    s++;
 }
 return s;
}


然后我想对这个int数组进行排序。

我必须像上面(char ** strArray)一样初始化字符串数组,然后将其转换为int数组,然后对其进行排序。有人可以帮我吗?我想问一下主要功能中的打印排序整数。

最佳答案

问题代码中需要注意的一些小事情:

char ** strArray;

if ( (strArray = malloc(sizeof(*strArray) + 3)) == NULL ) {
    fprintf(stderr, "ls1: couldn't allocate memory");
    //exit(EXIT_FAILURE);
}


如果成功,上述代码的目的是为strArray分配足够的内存,以用于三个char *。具体来说,为strArray [0],strArray 1和strArray [2]。

注意:正如下面的Matt McNabb的注释所指出的,它实际上错误地分配了足以容纳一个char *和三个额外字节的内存。

strArray[0] = NULL;


上面的行设置将** strArray中的第一个指针设置为NULL。

strArray[0] = "111";


上面的代码很奇怪。仅将strArray [0]设置为指向NULL之后,上一行将其更改为指向“ 111”。有点不必要将其设置为NULL(首先)。

strArray[1] = "222";
strArray[2] = "1";


上面两行正确地初始化了strArray中的其他两个指针。

strArray[3] = "2";


当该数组的元素确实不存在时,上一行尝试初始化strArray [3]。因此,它正在更改指向“ 2”的位置,但可能不会达到预期的结果。

通过将上面的代码更改为:

   char **strArray;
   size_t strArrayElements=4;

   if(NULL == (strArray = malloc((strArrayElements+1) * sizeof(*strArray))))
      {
      fprintf(stderr, "ls1: couldn't allocate memory");
      exit(EXIT_FAILURE);
      }

   strArray[strArrayElements] = NULL;

   strArray[0] = "111";
   strArray[1] = "222";
   strArray[2] = "1";
   strArray[3] = "2";


可以看出,以上代码将5个元素(strArrayElements + 1)分配给** strArray。最后一个元素strArray[4]初始化为NULL;指示End-Of-List的标记。然后初始化其他4个元素[0..3]。



现在将重点转移到:

int * toIntArray(char ** strArray) {
   int size = getCharArraySize(strArray);
   int intArray[size];
   int i;

   for ( i = 0; i < size  ; ++i)
      {
         intArray[i] = atoi(strArray[i]);
         printf( "r[%d] = %d\n", i, intArray[i]);
      }
   intArray[size] = '\0';
   return intArray;
}


上面的代码成功地将字符串转换为整数形式,并将其存储在intArray中。但是,该代码在尝试return intArray调用方时存在缺陷。 intArray变量被声明为本地堆栈对象。 return语句使所有此类堆栈变量变为无效;并允许堆栈存储器将此类变量用于其他用途。

也许下面的代码更好地表示了预期的目标。它从堆中为intArray分配内存。分配的内存可以超过return语句的寿命:

int *toIntArray(char **strArray)
   {
   int size = getCharArraySize(strArray);
   int *intArray = malloc(size * sizeof(*intArray));
   int i;

   for ( i = 0; i < size  ; ++i)
      {
      intArray[i] = atoi(strArray[i]);
      printf( "r[%d] = %d\n", i, intArray[i]);
      }

   intArray[size] = '\0';
   return(intArray);
   }




破坏代码可能在here中找到。

关于c - 如何从字符串数组转换为int数组,然后使用c对其进行排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23876772/

10-11 18:58