冒泡排序使数组为空
Bubble Sort leaves array empty
我正在尝试对 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;
}
}
}
您也对数组中的最后一个字符进行排序,从而得到一个带有前导空终止符的排序字符数组。
因此,只需调整您的循环来解决您的问题,如下所示。
当然最好用参数传递数组大小,但那是另一个话题:)
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;
}
}
}
这是因为字符串长度。第一个字符串的长度是 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;
}
}
}
我正在尝试对 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;
}
}
}
您也对数组中的最后一个字符进行排序,从而得到一个带有前导空终止符的排序字符数组。
因此,只需调整您的循环来解决您的问题,如下所示。
当然最好用参数传递数组大小,但那是另一个话题:)
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;
}
}
}
这是因为字符串长度。第一个字符串的长度是 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;
}
}
}