Reputation: 253
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. 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); */
Upvotes: 5
Views: 14378
Reputation: 29
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". You can do this with char pointers 'a' and 'b' as parameters.
Upvotes: -1
Reputation: 4453
I think better use macro for this task. In code below it is a macro SWAP.
Content a file 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:
Based on
4.1 Define a preprocessor macro swap(t, x, y)
4.2 Reversing an array In place
4.3 The answers on this question
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.
Upvotes: 0
Reputation: 23
for loop condition should be 'i < n'. and prototype declaration should match.
and "int n" is the size of array. So "i<=n" would make the same array reversed from end to mid, and again from mid to top. So result is same as array. make "n" as half of the array size.
Upvotes: 0
Reputation: 10516
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.
Upvotes: 5
Reputation: 3188
for loop condition should be 'i < n'. and prototype declaration should match.
Upvotes: 1