Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用指针反转C中的字符串?_C_String_Reverse - Fatal编程技术网

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

使用指针反转C中的字符串?,c,string,reverse,C,String,Reverse,语言:C 我正在尝试编写一个C函数,它使用头字符*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

语言:C

我正在尝试编写一个C函数,它使用头字符*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*strrev2(const char*string){
int l=strlen(字符串);
char*r=malloc(l+1);

对于(intj=0;jNo),您需要一个malloc

其他选择包括:

  • 修改字符串,但由于您有一个
    const char*
    ,并且不允许您更改函数签名,因此在这里不可能这样做
  • 添加一个参数,以便用户提供一个缓冲区,将结果写入其中,但是如果不更改签名(或者使用globals,这是一个非常糟糕的主意),这也是不可能的

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

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

您可以使用一个
静态字符[1024];
(1024是一个示例大小),存储此缓冲区中使用的所有字符串,并返回包含每个字符串的内存地址。下面的代码段可能包含bug,但可能会给您一些启示

#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 ;
}
#包括
#包括
字符*strrev2(常量字符*str)
{
静态字符缓冲区[1024];
static int last_access;//指向最左边的可用字节;
//检查缓冲区是否有足够的位置来存储新字符串

如果(strlen(str)将字符串反转到位

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;
}
char*reverse(char*str)
{
寄存器字符c、*开始、*结束;
开始=结束=str;
而(*end!='\0')end++;
while(开始<--end)
{
c=*开始;
*开始+=*结束;
*结束=c;
}
返回str;
}

如果不再需要,您可以释放
字符串,这将使您只需释放一件东西。但是,在这里释放它被认为是非常糟糕的编程,因为这是一个意外的副作用。您还可以使用静态字符**,它指向指向您在第一次调用时分配的内存区域的指针,并且是实字符我不会使用这种方法,因为你不知道最后一次调用是什么时候,所以你无法释放内存,但这可能会在面试中给他们留下深刻印象。:)如果你想让调用方负责释放内存,确保他们记住这样做的最好方法是让他们进行分配。