如何编写一个函数来永久更改传递的字符串

时间:2009-09-25 14:03:15

标签: c string function

如果我有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++;
}

有更好的方法吗?

3 个答案:

答案 0 :(得分:14)

只需通过指针访问数据:

#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 - 声明,如果不需要更改缓冲文本,应该

答案 1 :(得分:2)

问题已更改

如果指针指向只读数据,则无法更改指向的内容。

当写一个

char *data = "forty two";

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

要从文字常量初始化'字符串',而不是指定文字常量的指针,请将字符复制到数组

char data[] = "forty two";

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

答案 2 :(得分:0)

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

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