在交换一个char * []数组导致问题(Swapping in a char * array[ ]

2019-10-17 20:37发布

void sortArray(char* array[], int count){
int compare;
int index;
 for(index = 0; index < count; index++){ //runs through array, keeping track of index
   for(compare = index; compare < count; compare++){
        if (strcmp(array[compare] , array[index]) <= 0){
             swap(*(array+compare), *(array+index));
        }
   }
 }
}
void swap(char *strA, char *strB){
    char *temp = (char *)malloc((strlen(strA)+1) * sizeof(char));
    assert(temp!=NULL);
    strcpy(temp, strA);
    free(strA);
    strA=(char *)malloc((strlen(strB)+1) * sizeof(char));
    assert(strA!=NULL);
    strA=strcpy(strA, strB);
    free(strB);
    strB= (char *)malloc((strlen(temp)+1) * sizeof(char));
    assert(strB!=NULL);
    strcpy(strB, temp);
    free(temp);
}

给出的输出:

Array1[0]: Adam Pendleton
Array1[1]: Jeison Ortega
Array1[2]: Theodore Staake
Array1[3]: Patrick Mahoney
Array1[4]: Andrew Silberstein
Array1[5]: Alan Boulais
Array1[6]: Daniel Comeau
Array1[7]: Sean Mikhael
Array1[8]: Sarah Shank
Array1[9]: Daniel Verge
Array1[10]: Dhimitris Natsis
Array1[11]: Kathleen Lent
Array1[12]: Osei Collins
Array1[13]: Jason Hintlian
Array1[14]: Michael Gibson
Array1[15]: Alex Grossi
Array1[16]: Michael Svedberg
Array1[17]: Randall White
Array1[18]: Alvin Cordor
Array1[19]: Rodrigo Roldan
Array1[20]: Matthew McArthur
Array1[21]: Jesse Anaya
    Sorted Array1[0]: Adam Pendleton
    Sorted Array1[1]: Patrick Mahoney
    Sorted Array1[2]: Theodore Staake
    Sorted Array1[3]: Sarah Shank
    Sorted Array1[4]: Dhimitris Natsis
    Sorted Array1[5]: Alan Boulais
    Sorted Array1[6]: Alex Grossi
    Sorted Array1[7]: Alvin Cordor
    Sorted Array1[8]: Sean Mikhael
    Sorted Array1[9]: Osei Collins
    Sorted Array1[10]: Michael Svedberg
    Sorted Array1[11]: Daniel Comeau
    Sorted Array1[12]: Daniel Verge
    Sorted Array1[13]: Jason Hintlian
    Sorted Array1[14]: Jesse Anaya
    Sorted Array1[15]: Michael Gibson
    Sorted Array1[16]: Matthew McArthur
    Sorted Array1[17]: Randall White
    Sorted Array1[18]: Rodrigo Roldan
    Sorted Array1[19]: Kathleen Lent    <-----not sure why this is dupe
    Sorted Array1[20]:                  <-----not sure why this is here
    Sorted Array1[21]: Kathleen Lent

林不知道在哪里,这些空格来自或为什么有重名。 我甚至创建了一个名为reverseArray另一个函数,只是对调的第一和最后一个字符串,它看起来像这个问题来自于交换功能的茎,我的猜测是,当它被复制的琴弦有一些混乱那里。

因为这是正在发生的事情的只是一小部分,我已经在文本从文件里逐行读取填补的char * []数组与名称的字符串,通过阵列打印正确之前,它是证明这工作正常排序。

Answer 1:

我不知道您的具体问题,但你可以通过交换字符串位置的阵列中,而不是改变字符串本身做一个更简单,更高效的工作:

void sortArray(char* array[], int count) {
    int compare;
    int index;
    char *tmp;
    for(index = 0; index < count; index++) {
        for(compare = index; compare < count; compare++) {
            if (strcmp(array[compare], array[index]) <= 0) {
                tmp = array[compare];
                array[compare] = array[index];
                array[index] = tmp;
            }
        }
    }
}


Answer 2:

你的代码确切的问题是,你的swap()函数释放这两个指针传递给它,并不会返回指向它以任何形式分配新的内存。 其结果是,所有的数组中的指针你整理结束了指向已经被释放的内存 - 这是一个奇迹,它在所有工作。

为了解决这个问题,你可以改变的签名swap()参照采取两个指针:

void swap (char **strA, char **strB)

并通过指针在以它为:

swap(array+compare, array+index);

话虽这么说,克劳迪乌的建议,你只要将指针而不是拷贝数据周围可能是从长远来看,一个更好的主意。 :)



文章来源: Swapping in a char * array[ ] leading to issues
标签: c swap arrays