2017-03-01 178 views
-2

我是C編程的新手,我嘗試了一個函數來交換數組的變量,但我無法讓它工作,我不知道爲什麼。你能幫我麼?先謝謝你。C函數不能正常工作

下面的代碼:

#include <stdio.h> 

void inplace_swap(int *x, int *y){ 
    if (x!=y){ 
     *y = *x^*y; 
     *x = *x^*y; 
     *y = *x^*y; 
    } 
} 

void reverse_array(int a[], int cnt){ 
    int first, last; 
    for (first = 0, last = cnt-1; first <= last; first++, last--) 
     inplace_swap(&a[first], &a[last]); 
} 

int main(){ 
    //int eight = 80, seven = 70; 
    //inplace_swap(&eight, &seven); 
    //printf("New eight value is %d\n", eight); 
    //printf("New seven value is %d\n", seven); 

    int arr[5] = {1,2,3}; 
    reverse_array(&arr[3], 2); 
    printf("%d\n", arr[1]); 
    //int i; 
    //for (i=0;i < 4;i++) { 
    // printf("%d\n", arr[i]); 
    //} 
} 
+1

你會得到什麼結果?你有什麼嘗試,並且你使用了一個調試器? – Chimera

+3

'reverse_array(&arr [3],2);'你爲什麼要傳遞你沒有明確初始化的元素的地址? –

+1

除了上面的問題,你只打印第二個元素'arr','printf(「%d \ n」,arr [1]);' - >'for(int i = 0; i <3 ; ++ i)printf(「%d \ n」,arr [i]);' – George

回答

1

從你的代碼似乎要掉從陣列的最後兩個元素是0,0 你5元的陣列與1,2,3初始化,0,0 當您調用交換函數時,實際上是第四個元素的第三個元素,您基本上調換了第四個元素和第五個元素,並且實際上打印了第二個元素

+0

這是一個很好的答案。 – Chimera

0

全部評論和答案需要被理解,以便你瞭解你犯的錯誤。據說,我重新編寫了一些代碼,以使其工作。請研究的差異,並提出問題......

#include <stdio.h> 

/*** Prototypes - get in the habit of using them ***/ 
void inplace_swap(int *x, int *y); 
void reverse_array(int *a, int cnt); 
/***************************************************/ 

#define NUM_ELEMENTS(x)  (sizeof(x)/sizeof(x[0]))  

void inplace_swap(int *x, int *y) 
{ 
    if (*x!=*y) 
    { 
     printf("Doing swap...\n"); 
     *y = *x^*y; 
     *x = *x^*y; 
     *y = *x^*y; 
    } 
} 

void reverse_array(int *a, int cnt) 
{ 
    int first, last; 

    for (first = 0, last = cnt-1; first <= last; first++, last--) 
    { 
     inplace_swap(&a[first], &a[last]); 
    } 
} 

int main() 
{ 
    int arr[] = {1,1,2}; 

    reverse_array(arr, NUM_ELEMENTS(arr)); 

    for (int i = 0; i < NUM_ELEMENTS(arr); ++i) 
    { 
     printf("%d ", arr[i]); 
    } 
    printf("\n"); 

    return(0); 
} 
+1

假設必須使用'XOR'交換(這太可怕了),而不是if(x!= y)'if(* x!= * y)'的條件也會覆蓋數據是相同,以及指針是相同的。 –

+0

@WeatherVane啊!好點子。 – Chimera

+0

我會看看,謝謝!你的幫助是偉大的人! –

1

此代碼工作得很好:

#include <stdio.h> 

static void inplace_swap(int *x, int *y){ 
    if(x != y) { 
     *y = *x^*y; 
     *x = *x^*y; 
     *y = *x^*y; 
    } 
} 

static void print_array(int arr[], size_t count) { 
    size_t i; 
    for(i = 0; i < count; ++i) { 
     printf("%s%d", i ? ", " : "", arr[i]); 
    } 
    printf("\n"); 
} 

static void reverse_array(int a[], int cnt) { 
    int first, last; 
    for(first = 0, last = cnt-1; first <= last; first++, last--) { 
     inplace_swap(&a[first], &a[last]); 
    } 
} 

int main() { 
    int arr[] = { 1, 2, 3, 4, 5 }; 
    size_t count = sizeof(arr)/sizeof(arr[0]); 
    print_array (arr, count); 
    reverse_array(arr, count); 
    print_array (arr, count); 
} 

執行跟蹤:

1, 2, 3, 4, 5 
5, 4, 3, 2, 1 
2

reverse_array功能工作正常,但你不知道正確調用它主要有:

你想要這個:

int main() { 
    int arr[] = { 1,2,3 }; 
    reverse_array(arr, 3); 

    int i; 
    for (i=0;i < 3;i++) { 
    printf("%d\n", arr[i]); 
    } 
} 

有在你的代碼3個問題:

// here you declare an array of size 5 but you only initialize the first 3 elements 
//This is not actually a problem in first place 
int arr[5] = {1,2,3};  

// &arr[3] is the address of 4th element of the array, which has not 
// been initialized, This actually swaps arr[3] with arr[4] 
reverse_array(&arr[3], 2); 

// here you print the second element which has not been modified 
// at all by the reverse_array(&arr[3], 2); 
printf("%d\n", arr[1]); 

如前所述,異或交換的東西是老式的,只用於整數類型的作品。

+0

非常感謝你,錯誤在於調用數組。我修好了它,它能正常工作! –