2013-04-01 7 views
0

저는 아래와 같이 배열을 초기화하는 간단한 정렬 프로그램을 만들었습니다.일부 0으로 int 배열을 초기화하십시오.

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

내 정렬 기능은 [a]에 배열 [0]을 정렬하고 '\ 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"); 
} 
+1

주 함수 내에서 함수 프로토 타입을 쓰는 것이 좋은지 궁금합니다 ... – Recker

+0

배열의 길이를''bubble_sort''에 전달합니다. 보증 배열은'\ 0 '(= 0)로 끝나지 않습니다. – gongzhitaao

+0

"C는 0을 처리하고 '\ 0'은 여기에서 동일합니까?" - 정의에 따르면. '\ 0'only * 전통적으로 **'char' **의 배열의 끝을 알립니다 ** ... 그것은 일종의 일반적인 end-of-array 센티넬이 아닙니다. –

답변

6

'\0'는 정의에 의해 0입니다. 배열의 길이를 정렬 함수에 전달하거나 다른 정수 값을 종결 자로 선택하고 그 값을 절대로 사용하지 않도록하십시오.

4

문자 '\0'은 정확히 0과 같습니다. 정렬 알고리즘에 배열 길이를 전달한 다음이를 사용하는 것이 좋습니다.

+0

허, (거의) 똑같은 대답으로 50 초 동안 맞았다. – lxop

2

여기에서 C는 0과 '\ 0'을 처리합니까?

예. 둘 다 제로이기 때문입니다. 다른 언급했듯이, 또는 배열의 길이를 함수로 전달하거나 배열에 다른 구분 기호를 사용하면 배열에 포함되지 않도록 할 수 있습니다.

편집 : @ 짐 발터, 설명해 주셔서 감사합니다.

+0

''\ 0 '== 0'은 0으로 시작하는 숫자가 8 진수이고 C에'\ O' 표기법이 없다는 사실과 관련이 없습니다. –

+0

@JimBalter :'\ 0 ', 미안. – Jack

+0

@ 짐 발터 : 10 진수로 C가 '0'을 처리하면 0 =='\ 0'이 참일 것입니까? – Jack

2

'\ 0'을 NULL 문자이다 NULL 문자 .ascii와 코드 0

a[i]!='\0' is equivalent to a[i]!=0 

이므로 '\ 0'의 ASCII 값 (정수)로 주조 된 유형이다.

따라서 현재 요소가 0 일 때 루프가 중지됩니다. 배열 크기

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++) 
     { 
     ................................... 

변경 인쇄 작동하려면

수정 으로는 여분의 인수를 전달 :

,210
void print(int a[],int sz) 
{ 
    int i=0; 
    for(i=0;i<sz;i++) 
    { 
       ....................... 

참고 : C에서

가 포인터 소멸성에서 배열의 크기를 계산하는 (INT * A 또는 [η] INT)하는 것은 거의 불가능하다 ++. 따라서 항상 추가 인수 인 배열의 배열이 배열과 함께 전달됩니다.

그러나 문자 배열이 함수에 전달 될 때마다 NULL 문자가 발생할 때까지 배열을 반복하기 만하면 C/C++ 에서처럼 문자 배열이 문자 배열의 연속 요소에 저장되고 NULL 문자로 종료됩니다 .

관련 문제