![](/img/trans.png)
[英]Trying to reverse a string without using string.h library functions in C using pointers
[英]Reverse String function in C without library functions
这是我的任务:
实现反转空终止字符串的函数。 该函数的原型为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以查看函数是否起作用时,该字符串被反转了,但是在它后面有一些符号。
例如:如果我有char *str = "hello";
和Reverse(str);
在main
方法中, 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;
}
在获取大小的循环中,您没有计算空终止符。 因此,您的newString
也缺少空终止符。 确保做newString = malloc(size + 1);
,并将空终止符放在newString
的末尾。
您的代码中有几个问题:
size+1
个字节并在字符串末尾设置\\0
终止符。 ptr
复制到newString
。 这是一个改进的版本:
#include <stdio.h>
void Reverse(char *ptr) {
unsigned int left, right;
for (right = 0; *(ptr + right) != '\0'; right++) {
continue;
}
for (left = 0; left < right; left++, right--) {
char ch = ptr[left];
ptr[left] = ptr[right - 1];
ptr[right - 1] = ch;
}
}
int main(void) {
char buf[] = "Hello world";
Reverse(buf);
printf("%s\n", buf);
return 0;
}
它应该打印dlrow olleH
。
没有string.h
库函数的简单字符串反向函数:
#include <stdio.h>
void reverse(char *str, int n);
int main()
{
char str[100];
int n;
printf("Enter a string\n");
scanf("%s",&str);
for( n = 0; str[n] != '\0'; n++)
{
}
reverse(str,n);
puts(str);
return 0;
}
void reverse(char *str,int n)
{
printf("Length = %d\n",n);
printf("Reversed :\n");
int i;
char ch;
for(i = 0; i<n/2; i++)
{
ch = str[i];
str[i] = str[n-i-1];
str[n-i-1] = ch;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.