2013-10-11 29 views
4

嗨,我想實現一個反向數組代碼,但它似乎並沒有工作,我真的不知道爲什麼。 For循環似乎不起作用。我不知道爲什麼,因爲邏輯看起來對我來說很合適。在C中反轉數組?

#include <stdio.h> 
#include <string.h> 

void reverse(char, int); 

int main() 
{ 
    char a[100]; 
    gets(a); 

    reverse(a, strlen(a)-1); 

    printf("%s\n",a); 
    getchar(); 
    getchar(); 
    getchar(); 
    return 0; 
} 

void reverse(char ar[], int n) 
{ 
    char c; 
    int i = 0; 
    printf("n = %d" , n); 
    for (i = 0; i >= n ; i++){ 
     c = ar[i]; 
     ar[i] = ar[n]; 
     ar[n] = c; 
     printf("Processed"); 
     n--;} 

} 


/* 
if (begin >= n) 
return; 

c   = *(x+begin); 
*(x+begin) = *(x+n); 
*(x+n) = c; 
offs = x++; 
printf("Begin = %d , n = %d, offs = %p \n", begin, n, offs); 
reverse(x, ++begin, --n); */ 
+3

您可能希望通過使您的原型符合您的實際功能啓動。 – WhozCraig

+0

也許它應該是'我<= n'? – hasanovh

+0

下面是一個註釋掉的代碼,當我傳遞3個參數時會起作用,但是我希望將它限制爲傳遞2個參數,字符串及其長度 – JoC

回答

4
void reverse(char, int); //declaration wrong 

void reverse(char[], int); 
       ^^^ 

你的循環

for (i = 0; i >= n ; i++) // this fails i=0, n=some size 

應該

for (i = 0; i <= n ; i++) 

使用gets()使用fgets(),而不是避免定。

+0

對'reverse'函數裏面的這個數組做修改後實際上會起作用嗎?因爲不是指針被作爲參數發送。 – hasanovh

+1

@hasanovh數組是C中簡單命名的地址。Said - 地址作爲指針*值*傳遞給函數。它們是C的傳值成語的例外,但不是真的。他們的「價值」是他們的地址。大多數工程師稱這個地址同義性爲「指針衰減」,儘管我發現標語通常令人惱火,因爲「衰減」一詞在整個C99標準中只出現一次,而且它的外觀與將數組傳遞給函數完全無關。 – WhozCraig

+0

@hasanovh AS WhozCraig表示'數組只是簡單的命名地址在C.說地址是作爲指針值傳遞給函數'這個例子添加到WhozCriag的解釋。 http://ideone.com/B9e5hG – Gangadhar

1

for循環條件應爲'i < n'。和原型聲明應該匹配。

0

for循環條件應爲'i < n'。和原型聲明應該匹配。

和「int n」是數組的大小。所以「我< = n」會使相同的陣列從中間到中間顛倒,再從中間到頂部顛倒。所以結果與數組相同。使「n」爲數組大小的一半。

+1

他不需要將n分成兩半,因爲他在循環中遞減它,但很容易錯過。 – Dmitri

0

我覺得這個任務最好用宏。在下面的代碼中,它是一個宏SWAP


內容的文件的main.c

#include <string.h> 
#include <stdio.h> 

// swap values with respect a type it 
#ifndef SWAP 
    #define SWAP(type, a, b) \ 
    { \ 
     type temp = a; \ 
     a = b; \ 
     b = temp; \ 
    } 
#endif 


/* 
    Print an array integer items 
*/ 
void 
printIntArray(int array[], size_t length) { 
    char ending_charapter[] = ", "; 
    putchar('['); 
    for (size_t i = 0; i < length; ++i) { 
     printf("%d", array[i]); 
     if (i < length - 1) { 
      printf("%s", ending_charapter); 
     } 
    } 
    puts("]"); 
} 


/* 
    Print an array float items 
*/ 
void 
printFloatArray(float array[], size_t length) { 
    char ending_charapter[] = ", "; 
    putchar('['); 
    for (size_t i = 0; i < length; ++i) { 
     printf("%f", array[i]); 
     if (i < length - 1) { 
      printf("%s", ending_charapter); 
     } 
    } 
    puts("]"); 
} 


/* 
    Reverse an integer array in place 
*/ 
static int 
reverseIntArray(int *array, const size_t length) { 
    for (int i = 0; i < length/2; ++i) { 
     SWAP(int, array[i], array[length - i - 1]); 
    } 
    return 0; 
} 


/* 
    Reverse an float array in place 
*/ 
static int 
reverseFloatArray(float *array, const size_t length) { 
    for (int i = 0; i < length/2; ++i) { 
     SWAP(float, array[i], array[length - i - 1]); 
    } 
    return 0; 
} 


/* 
    Reverse an string 
*/ 
static int 
reverseString(char string[]) { 
    size_t str_len = strlen(string); 
    for (int i = 0; i < str_len/2; ++i) { 
     SWAP(char, string[i], string[str_len - i - 1]); 
    } 
    return 0; 
} 


int 
main (const int argc, const char *argv[]) 
{ 
    puts("An example reverse for a int array"); 
    int arrInt[4] = {1, -2, 3, -4}; 
    printIntArray(arrInt, 4); 
    reverseIntArray(arrInt, 4); 
    printIntArray(arrInt, 4); 

    puts("An example reverse for a float array"); 
    float arrFloat[4] = {0.1, -2.12, 1.3, -4.2}; 
    printFloatArray(arrFloat, 4); 
    reverseFloatArray(arrFloat, 4); 
    printFloatArray(arrFloat, 4); 

    puts("An example reverse for a string"); 
    char str[] = "Simple text"; 
    puts(str); 
    reverseString(str); 
    puts(str); 

    return 0; 
} 

編譯如下:

gcc std=c11 -I /usr/include/ -o main main.c 

結果:

An example reverse for a int array 
[1, -2, 3, -4] 
[-4, 3, -2, 1] 
An example reverse for a float array 
[0.100000, -2.120000, 1.300000, -4.200000] 
[-4.200000, 1.300000, -2.120000, 0.100000] 
An example reverse for a string 
Simple text 
txet elpmiS 

注:

  1. 只是工作
  2. Workint與任何內置型
  3. 不佳的測試,基於

    只使用GCC編譯器
  4. 4.1 Define a preprocessor macro swap(t, x, y)

    4.2 Reversing an array In place

    4。3在這個問題上


測試環境的答案

$ lsb_release -a 
No LSB modules are available. 
Distributor ID: Debian 
Description: Debian GNU/Linux 8.6 (jessie) 
Release: 8.6 
Codename: jessie 
$ uname -a 
Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux 
$ gcc --version 
gcc (Debian 4.9.2-10) 4.9.2 
Copyright (C) 2014 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.