![](/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.