我用两种方式编写了这段代码 试图在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。
答案 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;
}