如何从字符串数组转换为int数组,然后使用c对其进行排序

时间:2014-05-26 19:43:19

标签: c arrays sorting

我的字符串数组初始化如下:

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数组,然后对其进行排序。任何人都可以帮助我吗?我会问主要功能中打印的排序整数。

1 个答案:

答案 0 :(得分:0)

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

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";

可以看出,上面的代码为** strArray分配了5个元素(strArrayElements + 1)。最后一个元素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 找到扰流器代码。