我有这样初始化的字符串数组:
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/