为啥我的简单反向 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* 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 memset 功能不起作用? [复制]

为啥我的简单不匹配查询不起作用?

为啥我的简单 C 宏不起作用?

为啥我的前向声明不起作用? (简单功能)

为啥我的简单 if 语句不起作用?

为啥我的带有关联的简单 ExtJS 数据示例不起作用?