我制作了一个简单的排序程序,其中我初始化了如下的数组。
int a[]={9,4,7,8,5,2,6,1,0,3};
但我的排序功能将数组a [0]排序到[7]并将0视为' \ 0'并停止。如果我把0放在其他地方它只是排序到0并忽略数组的其余部分。 C是0和' \ 0'同样在这里?
我的冒泡排序计划如下。
#include<stdio.h>
#include<conio.h>
int main()
{
int a[]={9,4,7,8,5,2,6,1,0,3};
void bubble_sort(int *a);
void print(int *a);
bubble_sort(a);
print(a);
getch();
return 0;
}
void bubble_sort(int *a)
{
int i=0,j,t,n;
for(i=0;a[i]!='\0';i++)
{
n=0;
for(j=1;a[j]!='\0';j++)
{
if(a[j-1]>a[j])
{
t=a[j-1];
a[j-1]=a[j];
a[j]=t;
n++;
}
}
if(n==0)
{
break;
}
}
}
void print(int a[])
{
int i=0;
for(i=0;a[i]!='\0';i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
答案 0 :(得分:6)
'\0'
为0
。您需要将数组的长度传递给排序函数,或者选择不同的整数值作为终止符,并确保永远不会将该值用于其他任何值。
答案 1 :(得分:4)
字符'\0'
正好等于0.您需要将数组长度传递给排序算法,然后使用它。
答案 2 :(得分:2)
C是否正在处理0和'\ 0'在这里相同?
是。这是因为两者都是零。正如其他人提到的,或者你传递数组的长度来运行或使用为数组选择了另一个分隔符,你需要确保它不会包含在你的数组中。
编辑:@Jim Balter,谢谢你的澄清。答案 3 :(得分:2)
'\ 0'为NULL字符 .ASCII代码为NULL字符为0.
a[i]!='\0' is equivalent to a[i]!=0
因为'\ 0'是类型转换为其ASCII值(整数)。
因此,当当前元素为零时,循环停止。
为了修复它,传递一个额外的参数:数组大小
bubble_sort(a,sizeof(a)/sizeof(int));
print(a,sizeof(a)/sizeof(int));
将 bubble_sort 功能更改为:
void bubble_sort(int *a,int sz)
{
int i=0,j,t,n;
for(i=0;i<sz;i++)
{
n=0;
for(j=1;j<sz;j++)
{
...................................
将打印功能更改为:
void print(int a[],int sz)
{
int i=0;
for(i=0;i<sz;i++)
{
.......................
请注意:
在C ++中,几乎不可能从衰减指针(int * a或int a [])计算数组的大小。 因此,总是需要额外的参数:数组的大小与数组一起传递。
但是,无论何时将字符数组传递给函数,只需迭代数组直到遇到NULL字符,就像在C / C ++中一样,字符串存储在字符数组的连续元素中并由NULL字符终止。