冒泡排序使数组空

时间:2016-05-12 04:02:11

标签: c arrays sorting char bubble-sort

我正在尝试在C中对字符数组进行排序。我的冒泡排序算法是标准的,但是当我尝试使用排序方法打印数组时,它们似乎是空的。

这是我的指针使用问题吗?

#include <stdio.h>
#include <string.h>

char Gstr1[256];
char Gstr2[256];

void load();
void printArrays();
void sortArray(char *array);

main()
{

    load();
    printArrays();
    sortArray(&Gstr1[0]);
    sortArray(&Gstr2[0]);
    printf("\n\n");
    printArrays();
}

void load()
{
    memcpy (Gstr1,"Sed aliquam neque fermentum leo semper sagittis. Curabitur imperdiet, libero vulputate laoreet tristique, magna justo posuere, quis rutrum ligula tortor vitae eros. Phasellus sed dignissim elit, nec dictum ligula. Vivamus ornare ultrices odio eget dictum.",255);

    memcpy (Gstr2,"Lorem ipsum dolor si amet, consectetur adipiscing elit. Aenean dapibus libero a convallis sodales. Mauris placerat nisl leo, vitae tincidunt turpis tristique in. Pellentesque vehicula nisl vitae efficitur ornare. Nunc imperdiet  sem, in aliquam rhoncus at.",255);
}

void printArrays()
{
    printf(Gstr1);
    printf("\n\n");
    printf(Gstr2);
}

void sortArray(char *array)
{
     int i,j;
     char temp;

     for(i=0;i<(256-1);i++)
        for(j=0;j<(256-i-1);j++)
        {
            if((int)*(array+j)>(int)*(array+(j+1)))
            {
                temp=*(array+j);
                *(array+j)=*(array+(j+1));
                *(array+(j+1))=temp;
            }
        }
}

2 个答案:

答案 0 :(得分:1)

这是因为字符串长度。第一个字符串的长度为256,第二个字符串的长度为257,并且您没有处理'\ 0'字符。因此,建议使用memcpy_s()而不是memcpy(),并且使用strlen()而不是在for循环中对数组大小进行硬编码。但是,通过对for循环限制进行微小修正,以下代码将生成输出。

<强>代码:

#include <stdio.h>
#include <string.h>

char Gstr1[256];
char Gstr2[256];

void load();
void printArrays();
void sortArray(char *array);

main()
{

    load();
    printArrays();
    sortArray(&Gstr1[0]);
    sortArray(&Gstr2[0]);
    printf("\n\n");
    printArrays();
}

void load()
{
    memcpy (Gstr1,"Sed aliquam neque fermentum leo semper sagittis. Curabitur imperdiet, libero vulputate laoreet tristique, magna justo posuere, quis rutrum ligula tortor vitae eros. Phasellus sed dignissim elit, nec dictum ligula. Vivamus ornare ultrices odio eget dictum.",255);

    memcpy (Gstr2,"Lorem ipsum dolor si amet, consectetur adipiscing elit. Aenean dapibus libero a convallis sodales. Mauris placerat nisl leo, vitae tincidunt turpis tristique in. Pellentesque vehicula nisl vitae efficitur ornare. Nunc imperdiet  sem, in aliquam rhoncus at.",255);
}

void printArrays()
{
    printf(Gstr1);
    printf("\n\n");
    printf(Gstr2);
}

void sortArray(char *array)
{
     int i,j;
     char temp;

     for(i=0;i<strlen(array);i++)
        for(j=0;j<(strlen(array)-i-1);j++)
        {
            if((int)*(array+j)>(int)*(array+(j+1)))
            {
                temp=*(array+j);
                *(array+j)=*(array+(j+1));
                *(array+(j+1))=temp;
            }
        }
}

答案 1 :(得分:0)

您也可以对数组中的最后一个字符进行排序,从而生成带有前导空终止符的排序字符数组 因此,只需调整循环以解决问题,如下所示 当然最好使用参数传递数组大小,但这是一个不同的主题:)

void sortArray(char *array)
{
     int i,j;
     char temp;

     for(i=0;i<(256-2);i++)
        for(j=0;j<(256-i-2);j++)
        {
            if((int)*(array+j)>(int)*(array+(j+1)))
            {
                temp=*(array+j);
                *(array+j)=*(array+(j+1));
                *(array+(j+1))=temp;
            }
        }
}