Sainath S.R
Sainath S.R

Reputation: 3306

Program to reverse a string in C without declaring a char[]

I need to reverse a given string and display it without using the value At[index] notation , I tried the below program using pointers,but it does not print anything for the reverse string,

Please help!

int main()    
{
    char* name=malloc(256);
    printf("\nEnter string\n");
    scanf("%s",name);
    printf("\nYou entered%s",name);

    int i,count;
    count=0;

   //find the length
    while((*name)!='\0')
    {
        count++;
        name++;
    }

    //pointer now at
    printf("\n%p",name);

    printf("\nLength is %d",count);

    name=name+count;
    //pointer now at
    printf("\n%p",name);

    for(i=0;i<(count);i++)
    {   
        printf("%c",(*name));
        name=name-1;
    }

    return 0;
}

Upvotes: 1

Views: 116

Answers (6)

mazhar islam
mazhar islam

Reputation: 5619

Important: scanf(" %s", name); has no bounds checking on the input. If someone enters more than 255 characters into your program, it may give undefined behaviour.

Now, you have the char array you have the count (number of char in the array), and you make name++ (name has the last char offset) then why do you need to bother doing stuffs like this?

name=name+count; 

Try this:

#include <stdio.h>

int main()

{
    char* name = malloc(256);
//  char name[256];
    printf("\nEnter string\n");
//  scanf("%s", name);
    fgets(name, 254, stdin); // carriage return and null character (256-2) 
    printf("\nYou entered %s", name);
    int i, count;
    count = 0;
//find the length
    while ((*name) != '\0' && (*name) != '\r') {
        count++;
        name++;
    }
//pointer now at
//  printf("\n%p", name);

//  printf("\nLength is %d", count);

//  name = name + count;
//pointer now at
//  printf("\n%p", name);

    for (i = count; i >= 0; i--) { // starts from last '\0'
        printf("%c", (*name));
        name = name - 1;
    }
    return 0;
}

I got the following output:

Enter string rakeb

You entered rakeb

bekar

Upvotes: 1

user3629249
user3629249

Reputation: 16540

Please post code that cleanly compiles

The current posted code is missing the required/used header files

the following code

1) includes error checking
2) limits the length of the user supplied string
   to avoid a input buffer overflow
3) eliminates certain lines (commented out)
   that caused 'name' to point to the wrong location
4) incorporates '\n' at the end of the printf() format strings
   so the info will be printed rather than held 
   in the buffer for stdout
5) at the end, passes the pointer to the malloc'd memory
   to the free() function
6) corrects the loop count when printing the 
   reverse of the input string

#include <stdio.h>
#include <stdlib.h>

#define MAX_NAME_LEN (256)

int main()
{
    char* name=NULL;
    char* temp = NULL;

    if( NULL ==(name=malloc(256)) )
    { // then malloc failed
        perror( "malloc for name[] failed");
        exit( EXIT_FAILURE );
    }

    // implied else, malloc successful

    temp = name;  // save ptr to malloc'd memory
    printf("\nEnter string\n");
    if( 1 != scanf("%255s", name) )
    { // then scanf failed
        perror( "scanf for name failed");
        exit( EXIT_FAILURE );
    }

    // implied else, scanf successful

    printf("\nYou entered: %s\n",name);

    int i,count;
    count=0;

   //find the length
    while((*name)!='\0')
    {
        count++;
        name++;
    }

    //pointer now at
    printf("\nAddress of last char in name[]: %p\n",name);

    printf("\nLength is %d\n",count);

    //name=name+count;
    //pointer now at
    //printf("\n%p",name);

    for(i=0;i<=count;i++)
    {
        printf("%c",(*name));
        name--;
    }
    printf( "\n" );

    free(temp);

    return 0;
} // end function: main

Upvotes: 0

Sateesh Pathak
Sateesh Pathak

Reputation: 1

Try this which will not only print but also reverse string and store it in name.

#include <stdio.h>

int main()

{
char* name = malloc(256);
char *backup1 = *bakcup2 = name;
printf("\nEnter string\n");
fgets(name, 254, stdin); // carriage return and null character (256-2) 
printf("\nYou entered %s", name);
while ((*backup1) != '\0' && (*backup1) != '\r') {
    backup1++;
}

backup1--; // Because here backup1 was pointing to '\0' or '\r'.
while(backup1 > backup2){
   /* Swapping characters */
    char temp;
    temp = *backup1;
    *backup1 = *backup2;
    *backup2 = temp;
    backup1--;
    backup2++;
}

backup1 = name;
while(*backup1 != '\0' && *backup1 != '\r') {
    printf("%c", (*backup1));
    backup1++;
}
return 0;
}

Upvotes: 0

john doe
john doe

Reputation: 42

Remove name=name+count; and add name--;

Upvotes: 2

Daniel Jour
Daniel Jour

Reputation: 16156

The easiest way? Just replace them with their syntactic equivalent:

arr[index] // is sugar for ...
arr + index

Then, instead of using two indices to traverse just use pointers. Using this you can actually find a solution pretty easy:

 void nreverse(char * str) {
  char * forward = str;
  char * backward = str + strlen(str) - 1;
  while (forward < backward) {
    char temp = *forward;
    *forward = *backward;
    *backward = temp;
    ++forward;
    --backward;
  }
}

Upvotes: 0

LPs
LPs

Reputation: 16213

Remove name=name+count; because of the name++ in the precedent loop moved name pointer to the '\0' char;

#include<stdio.h>
#include<stdlib.h>

int main()
{
    char* name=malloc(256);
    printf("\nEnter string\n");
    scanf("%s",name);
    printf("\nYou entered%s",name);

    int i,count;
    count=0;

    //find the length and move name pointer
    while((*name)!='\0')
    {
            count++;
            name++;
    }

    //pointer now at
    printf("\nPointer is: %p",name);

    printf("\nLength is: %d\n",count);

    for(i=1;i<=(count);i++)
    {   
        printf("%c",*(name-i));            
    }

    printf("\n");
    return 0;
}

OR change the final loop to

for(i=0;i<(count);i++)
{   
        name--;
        printf("%c",*name);
}

Upvotes: 2

Related Questions