2013-10-11 30 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.