简体   繁体   English

在 C 中反转数组?

[英]Reversing Array in C?

Hi i trying to implement a reverse array code but it doesnt seem to work and im really not sure why.嗨,我试图实现一个反向数组代码,但它似乎不起作用,我真的不知道为什么。 The For loop just doesnt seem to work. For 循环似乎不起作用。 I dont know why because the logic seems pretty right to me.我不知道为什么,因为逻辑对我来说似乎很正确。

#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); */
void reverse(char, int);  //declaration wrong

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

Your loop你的循环

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

should be应该是

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

Avoid using gets() use fgets() instead.避免使用gets()使用fgets()代替。

for loop condition should be 'i < n'. for 循环条件应该是'i < n'。 and prototype declaration should match.和原型声明应该匹配。

for loop condition should be 'i < n'. for 循环条件应该是'i < n'。 and prototype declaration should match.和原型声明应该匹配。

and "int n" is the size of array. “int n”是数组的大小。 So "i<=n" would make the same array reversed from end to mid, and again from mid to top.所以 "i<=n" 会使相同的数组从尾端反转到中点,再从中点反转到顶端。 So result is same as array.所以结果与数组相同。 make "n" as half of the array size.将“n”设为数组大小的一半。

I think better use macro for this task.我认为最好使用宏来完成这项任务。 In code below it is a macro SWAP .在下面的代码中,它是一个宏SWAP


Content a file main.c包含文件 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;
}

Compilation as:编译为:

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

Result:结果:

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

Notes:注意事项:

  1. Just working刚工作
  2. Workint with any built-in type使用任何内置类型工作
  3. Poorly tested and used only the GCC compiler测试不佳,仅使用 GCC 编译器
  4. Based on基于

    4.1 Define a preprocessor macro swap(t, x, y) 4.1 定义预处理器宏swap(t, x, y)

    4.2 Reversing an array In place 4.2 原地反转数组

    4.3 The answers on this question 4.3 本题答案


Testing environment测试环境

$ 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.

Not gonna lie, it seems as though you're handling too much in the "reverse function".不会撒谎,好像您在“反向功能”中处理了太多。 I personally like to break down my code as much as possible, so that it's easier to find mistakes.我个人喜欢尽可能地分解我的代码,这样更容易发现错误。

To start, you may want to put the swapping process (for loop) in its own function called "swap".首先,您可能希望将交换过程(for 循环)放在它自己的名为“swap”的函数中。 You can do this with char pointers 'a' and 'b' as parameters.您可以使用字符指针 'a' 和 'b' 作为参数来执行此操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM