Pass a Char Array to a pointer in a function

I've specified the function definition in the header file (strv.h):

void strRev(char* theString);

Here is my function:

#include "strv.h"
void strRev(char* theString){
      char *pEnd = theString;
      char temp;      
      while (*pEnd) pEnd++;  
      pEnd--;                              
      while (theString < pEnd) {
            temp = *pEnd;              
            *pEnd-- = *theString;
            *theString++ = temp;        
      }
}

Now, I'm trying to call this from main, but getting an error:

#include "strv.h"
#include <iostream.h>
void main(){
      char sArr[7] = "abcdef";
      strRev(&sArr[0]);
      cout<<sArr<<endl;
}


I'm getting the following error:

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/Str2.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

What is this??
LVL 11
bingieAsked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
AlexFMConnect With a Mentor Commented:
Your code is OK, but you have a problem with application type. Your application has main function, this means, linker option should be: /SUBSYSTEM:CONSOLE. Currently you have  /SUBSYSTEM:WINDOWS, and linker needs WinMain function for this. If you use VC++ 6, change /subsystem:windows to /subsystem:console in Project - Settings - Link - Project options.
You can create new project of type "Console Application" and paste this code to it.
0
 
GlomCommented:
I think AlexFM solved your problem.
I just wanted to say that, in your main function, instead of :

strRev(&sArr[0]);

you should use

strRev(sArr);

Which gives exactly the same result, but aren't the laziest devs the better ? :p

Glom
0
 
itsmeandnobodyelseCommented:
Or take that: (i tried to remove pointer arithmetics as it isn't recommended in C++).

void strRev(char theString[], int len);

#include "strv.h"
void strRev(char theString[], int len)
{
     char temp;    
     for (int i = 0; i < len/2; ++i)
     {
          temp                  = theString[len-1-i];            
          theString[len-1-i] = theString[i];
          theString[i]          = temp;      
     }
}

#include "strv.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
     char sArr[] = "abcdefg";
     strRev(sArr, sizeof(sArr)-1);
     AfxMessageBox(sArr);
     return 0;
}

Regards, Alex




0
 
rstaveleyCommented:
FWIW... Nice also to consider using the iterator constructor with reverse iterators from std::string.
--------8<--------
#include <string>
#include "windows.h"
#pragma comment(lib,"user32.lib")

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
     std::string sArr = "abcdefg";
     MessageBox(NULL,std::string(sArr.rbegin(),sArr.rend()).c_str(),"",MB_OK);
     return 0;
}
--------8<--------
0
 
byttaCommented:
I think AlexFM  solved your problem, but these kinds of programs should be created as
Visual C++ Projects -> Console Application  (in MS visual studio 2003)
Then you get an "int _tmain()" instead of the "int APIENTRY WinMain()" or whatever

You might also want to try the char * strrev(char *) function from <string.h> (Most operations on char arrays have been solved there.)
It reverses a null terminated string (no need to input the length) and returns a pointer to it;

#include <iostream.h>
#include <string.h>
void main(){
     char sArr[7] = "abcdef";
     strrev(&sArr[0]);            
     cout<<sArr<<endl;
}

// the only real difference between &sArr[0] and sArr is that its very hard to forget that &sArr[0] is a pointer
0
All Courses

From novice to tech pro — start learning today.