簡體   English   中英

沒有庫函數的C中的反向字符串函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM