这是我的任务:
实现反转空终止字符串的功能。函数原型(prototype)为void Reverse(char *ptr);
。不要使用标准库函数。
这是我现在的代码:
void Reverse(char *ptr) {
char *newString;
char ch = *ptr;
unsigned int size = 0;
for (int i = 1; ch != '\0'; i++) {
ch = *(ptr + i);
size++;
}
newString = (char*)malloc(size);
for (int left = 0, right = size - 1; left < size; left++, right--) {
*(newString + left) = *(ptr + right);
}
printf("%s", newString);
printf("\n");
}
它将字符串反转并保存在newString中
我的第一个问题是,当我打印 newString 以查看函数是否有效时,字符串被反转,但在它之后有一些符号。
例如:
如果我在 main
方法中有 char *str = "hello";
和 Reverse(str);
printf("%s", newString)
的结果将是 olleh****
。
但是如果改变
newString = (char*)malloc(size);
到
newString = (char*)malloc(1);
它工作正常。
我的第二个问题是我不知道如何将 newString 保存到给定的字符串中。我正在使用新的字符串,因为无法更改给定的字符串。
最佳答案
对于初学者来说,最好像这样声明函数
char * Reverse( char *ptr );
^^^^^^
因为标准 C 字符串函数通常返回指向目标字符串的指针。
该函数应该反转原始字符串。它可能不会创建动态字符串,因为如果函数的返回类型为 void,函数的调用者将无法释放它。
该函数看起来就像下面的演示程序所示。
#include <stdio.h>
char * Reverse( char *ptr )
{
char *first = ptr, *last = ptr;
while ( *last ) ++last;
if ( first < last )
{
for ( ; first < --last; ++first )
{
char c = *first;
*first = *last;
*last = c;
}
}
return ptr;
}
int main( void )
{
char s[] = "Hello World!";
puts( s );
puts( Reverse( s ) );
return 0;
}
它的输出是
Hello World!
!dlroW olleH
请注意,您可能不会像这样调用该函数
puts( Reverse( "Hello World!" ) );
因为字符串文字在 C 中是不可变的。
如果你要像这样声明函数
void Reverse( char *ptr );
然后只需删除所示函数中的 return 语句即可。例如
#include <stdio.h>
void Reverse( char *ptr )
{
char *first = ptr, *last = ptr;
while ( *last ) ++last;
if ( first < last )
{
for ( ; first < --last; ++first )
{
char c = *first;
*first = *last;
*last = c;
}
}
}
int main( void )
{
char s[] = "Hello World!";
puts( s );
Reverse( s )
puts( s );
return 0;
}
如果将您的方法与索引一起使用,那么该函数可能看起来像
#include <stdio.h>
void Reverse( char *ptr )
{
size_t size = 0;
while ( *( ptr + size ) ) ++size;
if ( size != 0 )
{
for ( size_t left = 0, right = size - 1; left < right; left++, right-- )
{
char c = ptr[left]; // or char c = *( ptr + left ); and so on
ptr[left] = ptr[right];
ptr[right] = c;
}
}
}
int main( void )
{
char s[] = "Hello World!";
puts( s );
Reverse( s );
puts( s );
return 0;
}
关于c - 没有库函数的 C 中的反向字符串函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38396003/