2
// ExampleCodes.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<stdio.h>
#include<iostream>
using namespace std;    

char* stringReverse(char* s)    
{    

    char temp, *p,*q;    
    q = s;    
    while( *(++q));    
    for( p = s; p &lt; --q; p++)    
    {    
        temp = *p;    
        *p = *q;     
        *q = temp;    
    }    
    return s;    
}    


int _tmain(int argc, _TCHAR* argv[])    
{    

    stringReverse("StringReverse");    
    return 0;    
}    
10
  • Indent your source code with four spaces to get it to display correctly. Commented Sep 12, 2010 at 23:31
  • Almost exactly the same as stackoverflow.com/questions/480555/modifying-c-string-constants , stackoverflow.com/questions/1614723/… , stackoverflow.com/questions/2124600/… and many more... Commented Sep 12, 2010 at 23:34
  • 2
    Shouldn't the compiler atleast give you a warning about passing a const char* to a char* parameter. Commented Sep 12, 2010 at 23:38
  • 4
    You seem to have accidentally omitted your question. Commented Sep 13, 2010 at 0:08
  • @Alexander Rafferty: The type of string literals in C is char [], which decays to char * (this despite them being unmodifiable). This is because string literals pre-date the const keyword. Commented Sep 13, 2010 at 0:12

5 Answers 5

8

You can't modify constant string literals.

stringReverse("StringReverse");

You could use a character array instead:

char str[] = "StringReverse";
Sign up to request clarification or add additional context in comments.

Comments

5

String literals, like "StringReverse", are not allowed to be modified in C. Use an array:

char str[] = "StringReverse";
stringReverse(str);

Note that your stringReverse() function has undefined behaviour if you feed it a zero-length string.

Comments

0

You never allocated any memory for p. You can try p = new char[sizeof(s)];

2 Comments

p doesn't need its own memory - the function reverses a string in-place.
Okay, my mistake. His function doesn't seem to make much sense to me. I think that it could be changed to be make more clear.
0

Perhaps you should write something like this:

// in - string to reverse
// out - buffer for reversed string
// l - size of in

StringReverse(char* in, char* out, int l) {
  for (int i=0;i<l;i++) {
    out[l-(i+1)] = in[i];
  }
}

*There is very very little to no speed difference between [] and *(p++) / *(p--)

Comments

-1

Well I was going to clean up the awful source in the OP but instead I'll just post a cleaner version:

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

void reverse_string(char *s)
{
    char *q = s + strlen(s);
    for (char *p = s; p < --q; p++)
    {
        char temp = *p;
        *p = *q;
        *q = temp;
    }
}

int main()
{
    char s[] = "StringReverse";
    reverse_string(s);
    puts(s);
    return 0;
}

I hope for your sake Amit that you're still a student.

Update0

This is actually pure C, so learn from and awe at its performance but don't start writing C++ like this.

5 Comments

I'm half tempted to downvote for "cleaning up" code, and then adding an xor hack.
I'm half-tempted to downvote just for the xor hack. Unless you've got a benchmark showing that xor is universally faster than using a temporary, don't bother with it.
The xor stuff was just for kicks, I'll remove it.
Still, this is a C++ question. What's with std::swap(*p,*q)? And in C++, those headers should be <cstdio> and <cstring>, and it's std::strlen().
@sbi: Yeah that's true. Suddenly I don't feel like doing C++ (that was quick, I hadn't started yet) ;]

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.