在 C 中反转后无法打印字符串
Can't print string after reverse in C
我正在将此函数写入 return 反转字符串的字符指针。
void * PreverseStr (char str[])
{
int size = strlen (str);
char *returnstr = (char *)malloc (size * sizeof(char));
for (int i = size - 1; i >= 0 ; i--)
{
*returnstr = str[i];
returnstr ++;
}
returnstr = 0;
returnstr -= size;
return returnstr ;
}
为了测试这个功能,我写了一个像这样的主函数
int main()
{
char str[] = "abcdefghijklmnopqrstuvwxyz";
char *newstr = PreverseStr(str);
printf("Reversed string using pointer: %s\n", newstr);
free(newstr);
return 0;
}
但是它在打印出任何东西之前就崩溃了。我想知道我的代码有什么问题。如果您能解释对此的修复,那将非常有帮助。
对于初学者来说,return 类型 void *
毫无意义。 return 类型应该是 char *
。由于函数在不更改源字符串的情况下创建新字符串,因此函数参数应具有限定符 const
.
这个内存分配
char *returnstr = (char *)malloc (size * sizeof(char));
分配的资源不足 space tp 存储源字符串的终止零字符 '[=20=]'
。
你至少需要写
char *returnstr = (char *)malloc ( ( size + 1 ) * sizeof(char));
在 for 循环之后指针 returnstr
指向超出分配的内存,因为它在循环内增加了
returnstr ++;
而且在这次作业之后
returnstr = 0;
变成空指针
函数可以通过以下方式声明和定义
char * reverse_copy( const char s[] )
{
size_t n = strlen( s );
char *p = malloc( n + 1 );
if ( p != NULL )
{
p += n;
*p = '[=14=]';
while ( n-- )
{
*--p = *s++;
}
}
return p;
}
这里有一个演示程序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *reverse_copy( const char s[] )
{
size_t n = strlen( s );
char *p = malloc( n + 1 );
if (p != NULL)
{
p += n;
*p = '[=15=]';
while (n--)
{
*--p = *s++;
}
}
return p;
}
int main( void )
{
const char *s = "Hello, World!";
puts( s );
char *p = reverse_copy( s );
if (p) puts( p );
free( p );
}
它的输出是
Hello, World!
!dlroW ,olleH
我正在将此函数写入 return 反转字符串的字符指针。
void * PreverseStr (char str[])
{
int size = strlen (str);
char *returnstr = (char *)malloc (size * sizeof(char));
for (int i = size - 1; i >= 0 ; i--)
{
*returnstr = str[i];
returnstr ++;
}
returnstr = 0;
returnstr -= size;
return returnstr ;
}
为了测试这个功能,我写了一个像这样的主函数
int main()
{
char str[] = "abcdefghijklmnopqrstuvwxyz";
char *newstr = PreverseStr(str);
printf("Reversed string using pointer: %s\n", newstr);
free(newstr);
return 0;
}
但是它在打印出任何东西之前就崩溃了。我想知道我的代码有什么问题。如果您能解释对此的修复,那将非常有帮助。
对于初学者来说,return 类型 void *
毫无意义。 return 类型应该是 char *
。由于函数在不更改源字符串的情况下创建新字符串,因此函数参数应具有限定符 const
.
这个内存分配
char *returnstr = (char *)malloc (size * sizeof(char));
分配的资源不足 space tp 存储源字符串的终止零字符 '[=20=]'
。
你至少需要写
char *returnstr = (char *)malloc ( ( size + 1 ) * sizeof(char));
在 for 循环之后指针 returnstr
指向超出分配的内存,因为它在循环内增加了
returnstr ++;
而且在这次作业之后
returnstr = 0;
变成空指针
函数可以通过以下方式声明和定义
char * reverse_copy( const char s[] )
{
size_t n = strlen( s );
char *p = malloc( n + 1 );
if ( p != NULL )
{
p += n;
*p = '[=14=]';
while ( n-- )
{
*--p = *s++;
}
}
return p;
}
这里有一个演示程序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *reverse_copy( const char s[] )
{
size_t n = strlen( s );
char *p = malloc( n + 1 );
if (p != NULL)
{
p += n;
*p = '[=15=]';
while (n--)
{
*--p = *s++;
}
}
return p;
}
int main( void )
{
const char *s = "Hello, World!";
puts( s );
char *p = reverse_copy( s );
if (p) puts( p );
free( p );
}
它的输出是
Hello, World!
!dlroW ,olleH