为啥我的简单反向 char* 不起作用?
Posted
技术标签:
【中文标题】为啥我的简单反向 char* 不起作用?【英文标题】:why my simple reverse char* does not working?为什么我的简单反向 char* 不起作用? 【发布时间】:2014-04-22 21:15:12 【问题描述】:我用两种方式编写了这段代码 尝试在 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--;
输入是
char* n = "abcdef";
revReq(n);
异常
Ex003.exe 中 0x00B11E7C 处未处理的异常:0xC0000005:访问冲突读取位置 0xFFFFFFFF。
【问题讨论】:
在内存分配期间不要忘记为空终止符添加+1
你为什么忽略整个标准库? std::reverse(str, str+strlen(str)-1);
。 std::string
会更好。
这是学术实践...我不想使用 (*str+1)
应该是*(str+1)
。
好的,谢谢。 ... *(str+1) ... 还是不行
【参考方案1】:
在第一个函数中,您将指针 str 中的字符加 1 与 '\0' 进行比较 只有当 char 等价于 signed char 并且 *str 的内部代码等于 255 (-1 )。
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;
【讨论】:
【参考方案2】:使用 strlen(str) + 1 strlen函数返回不包括空字符'\0'的字符串大小
【讨论】:
添加这个 - 仍然有同样的问题。 @Yanshof:您需要在[]
中使用+1
。以上是关于为啥我的简单反向 char* 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章