繁体   English   中英

使用指针反转C中的字符串?

[英]Reversing a string in C using pointers?

语言:C

我正在尝试编写一个C函数,它使用头文件char * strrev2(const char * string)作为面试准备的一部分,最接近(工作)的解决方案如下,但是我想要一个不包含malloc的实现...这可能吗? 因为它返回一个字符意味着如果我使用malloc,则必须在另一个函数中使用free。

char *strrev2(const char *string){
    int l=strlen(string);
    char *r=malloc(l+1);
    for(int j=0;j<l;j++){
        r[j] = string[l-j-1];
    }
    r[l] = '\0';
    return r;
}

[编辑]我已经使用缓冲区编写实现而没有char。 谢谢你!

不 - 你需要一个malloc。

其他选择是:

  • 就地修改字符串,但由于你有一个const char *并且不允许你更改函数签名,所以这里不可能。
  • 添加一个参数,以便用户提供一个写入结果的缓冲区,但是如果不更改签名(或使用全局变量,这是一个非常糟糕的主意),这是不可能的。

你可以这样做,让调用者负责free内存。 或者您可以允许调用者传入已分配的char缓冲区,因此分配和free都由调用者完成:

void strrev2(const char *string, char* output)
{
    // place the reversed string onto 'output' here
}

对于来电者:

char buffer[100];
char *input = "Hello World";
strrev2(input, buffer);
// the reversed string now in buffer

你可以使用static char[1024]; (1024是示例大小),存储此缓冲区中使用的所有字符串并返回包含每个字符串的内存地址。 以下代码段可能包含错误,但可能会提供您的想法。

#include <stdio.h>
#include <string.h>

char* strrev2(const char* str)
{

    static char buffer[1024];
    static int  last_access; //Points to leftmost available byte;

    //Check if buffer has enough place to store the new string
    if( strlen(str) <= (1024 - last_access) )
    {
        char* return_address = &(buffer[last_access]);
        int i;

        //FixMe - Make me faster
        for( i = 0; i < strlen(str) ; ++i )
        {
            buffer[last_access++] = str[strlen(str) - 1 - i];
        }       

        buffer[last_access] = 0;
        ++last_access;

        return return_address;           
    }else
    {
        return 0;
    }
}

int main()
{
    char* test1 = "This is a test String";
    char* test2 = "George!";
    puts(strrev2(test1));
    puts(strrev2(test2));
    return 0 ;
}

反向弦到位

char *reverse (char *str)
{
  register char c, *begin, *end;
  begin = end = str;

  while (*end != '\0') end ++;

  while (begin < --end) 
  {
    c = *begin;
    *begin++ = *end;
    *end = c;
  }
  return str;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM