为什么我的简单反向字符*不起作用?

时间:2014-04-22 21:15:12

标签: c++

我用两种方式编写了这段代码 试图在visual studio 2012中运行 - 我打开项目作为简单的控制台应用程序,我获得访问评估例外。

代码1

void revReq(char* str)
{
     if(*(str+1) != '\0')
          revReq(str+1);
     putchar(*str);
}

代码2

void rev(char* str)
{
char* retVal = new char[strlen(str)]+1;

char* ptr = str + strlen(str)-1;
int i = 0;
while(ptr != str)
{
    retVal[i++]=*ptr;
    *ptr = '\0';
    ptr--;
}   
}

inpus是

    char* n = "abcdef";
revReq(n);

例外

Ex003.exe中0x00B11E7C处的未处理异常:0xC0000005:访问冲突读取位置0xFFFFFFFF。

2 个答案:

答案 0 :(得分:2)

使用strlen(str)+ 1 strlen函数返回字符串的大小,不包括空字符' \ 0'

答案 1 :(得分:2)

在第一个函数中,将指针str加1中的字符与'\ 0'进行比较只有当char等于signed char并且* str的内部代码等于255(-1)时,条件才能等于true )。

void revReq(char* str)
{
     if((*str+1) != '\0')
          revReq(str+1);
     putchar(*str);
}

有效代码将为

void revReq( const char *s)
{
     if( *str )
     { 
          revReq( str + 1 );
          putchar( *str );
     }
}

第二个功能也是错误的。至少你必须写

char* retVal = new char[strlen(str) + 1];

而不是

char* retVal = new char[strlen(str)]+1;

还有内存泄漏。该函数必须返回反向字符串。

有效代码将显示为

char * rev( const char *s )
{
   size_t n = strlen( s );
   char *p = new char[ n + 1];

   const char *s1 = s + n;
   char *q = p;

   while ( s1 != s ) *q++ = *--s1; 
   *q = '\0';

   return p;
}