【问题标题】:How do I write a function to permanently change a passed string如何编写函数来永久更改传递的字符串
【发布时间】:2010-12-01 10:31:45
【问题描述】:

如果我有char* str;,我该如何编写一个接受str 并可以对str 进行更改的函数,以便在函数返回后更改仍然存在?

我拥有的是:

char *str = (char *) malloc(10);
sprintf(str, "%s", "123456789");
//str points to 1
move_ptr(&str);
//str points to 2

void move_ptr(char** str)
{
    *str++;
}

有没有更好的方法来做到这一点?

【问题讨论】:

  • 小心:如果你增加指针'str',你就会丢掉分配内存的句柄,从而造成内存泄漏。
  • Johnathan 提出了一个很好的观点,尽管它比泄漏更糟糕:如果你增加唯一指向你的 malloced 内存的指针并尝试 free(str ) 增加的值,你的程序几乎肯定会崩溃。

标签: c string function


【解决方案1】:

只需通过指针访问数据,在函数中:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

void change_string(char *str)
{
  size_t i;

  /* As an example, make it all upper case. */
  for(i = 0; str[i]; ++i)
    str[i] = toupper(str[i]);
}

int main(void)
{
  char buffer[32];
  char *str = buffer;

  strcpy(str, "test string");
  change_string(str);
  printf("it's now %s\n", str);

  return EXIT_SUCCESS;
}

想一想,您会注意到标准的strcpy() 函数正是您所描述的类别。这是 C 语言中非常常见的操作。

更新:问题已被大大重写,现在似乎更多是关于更改指针本身,而不是数据。也许一直都是这个意思,但我没明白。

问题中的解决方案很好,但我个人觉得使用返回值更方便,如果可能的话:

char * change_pointer(char *str)
{
  return str + 1;
}

int main(void)
{
  char *str = "test string";

  printf("now '%s'\n", str);
  str = change_pointer(str);
  printf("now '%s'\n", str);
  return EXIT_SUCCESS;
}

指针当然也可以是const-declared,如果不需要更改缓冲文本,应该是。

【讨论】:

  • 如果我想改变str中str指向的位置,我是否必须使用一个函数,将char **str作为参数,然后将str作为&str传入?
  • @unknown:这听起来像是一个不同的问题......但当然这是解决它的一种方法。如果可能,我更喜欢使用返回值,以便函数返回更新后的字符串指针。
【解决方案2】:

问题改变了

如果你的指针指向只读数据,你不能改变它指向的内容。

当一个人写作时

char *data = "forty two";

“四十二”是只读数据;而且无论是直接还是通过函数调用,您都无法更改指针data 指向的内容。

要从字面常量初始化“字符串”,而不是分配指向字面常量的指针,而是将字符复制到数组中

char data[] = "forty two";

现在 data 是一个包含 10 个字符的数组(9 个用于字母和空格 + 1 个用于 NUL 终止符),您可以随意更改。

【讨论】:

    【解决方案3】:

    您的示例可能过于简化,但以防万一...小心做这样的事情,因为您将泄漏内存。在你的函数调用之后,你不再有一个指向你分配的(部分)原始内存的指针。

    正如unwind 所述,返回新指针可能是更好的选择。虽然它实现了相同的目标,但更明显的是,您需要保留原始指针以释放内存。反驳的论点是它给人的印象是,一旦获得返回值,您就可以释放原始指针,这是您无法做到的,因为它们都指向同一内存块中的(不同位置)。

    【讨论】:

    • 这比泄漏更糟糕,调用 free() 并带有 未返回的任何值 malloc()几乎肯定会导致崩溃。
    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 2015-05-12
    • 2017-02-27
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2023-02-02
    • 2023-02-04
    相关资源
    最近更新 更多