c - 没有库函数的 C 中的反向字符串函数

标签 c string algorithm pointers reverse

这是我的任务:

实现反转空终止字符串的功能。函数原型(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/

相关文章:

python - 根据文件中的选项卡拆分字符串

php从带有引号的数组中获取值

php - 在数组中搜索匹配的字符串

c - 将字符串数组作为字符指针传递

C++:在 C 或 C++ 中以普通文本模式(非二进制)写入 vector 文件以输出最快

c - C 程序中的错误小于预期

algorithm - Tabu Search如何用于解决Traveling Purchaser

算法 - 动态规划 - 两个数组的子集和

algorithm - 打印总和等于 k ​​的集合的子集

c - 除了共享内存的大小之外,是什么阻止了我进一步读/写? (系统 V IPC)