0

我做了一个简单的排序程序,我在其中初始化了如下所示的数组。

int a[]={9,4,7,8,5,2,6,1,0,3};

但我的排序函数将数组 a[0] 排序为 a[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");
}
4

4 回答 4

6

'\0'0根据定义。您需要将数组的长度传递给排序函数,或者选择一个不同的整数值作为终止符,并确保您永远不会将该值用于其他任何事情。

于 2013-04-01T04:02:44.257 回答
4

该字符'\0'完全等于 0。您需要将数组长度传递给排序算法,然后使用它。

于 2013-04-01T04:03:34.653 回答
2

C 在这里对待 0 和 '\0' 是一样的吗?

是的。这是因为两者都是零。正如其他人所提到的,或者您将数组的长度传递给函数或使用为您的数组选择另一个分隔符,您需要确保它不会包含在您的数组中。

编辑:@Jim Balter,感谢您的澄清。

于 2013-04-01T04:06:43.080 回答
2

'\0' 为 NULL 字符。NULL 字符的 ASCII 码为 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 字符终止。

于 2013-04-01T04:08:29.673 回答