Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I write a function to permanently change a passed string

Tags:

c

function

string

If i have char* str; how do I write a function that accepts str and can make changes to str so that, the changes persist after the function returns?

what I have is:

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++;
}

is there a better way to do that?

like image 263
user105033 Avatar asked Dec 06 '22 04:12

user105033


2 Answers

Just access the data through the pointer, in the function:

#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;
}

Come to think of it, you'll notice that the standard strcpy() function is exactly of the category you describe. It's a very common operation in C.

UPDATED: The question has been significantly rewritten, now it seems to be more about changing the pointer itself, rather than the data. Perhaps this was the meaning all along, but I didn't understand.

The solution in the question is fine, but personally I find it more convenient to work with return values, if possible:

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;
}

The pointer(s) could of course also be const-declared, and should be if no changes to the buffered text are needed.

like image 62
unwind Avatar answered Dec 07 '22 17:12

unwind


Question changed

If your pointer points to readonly data, you can't change what it points to.

When one writes

char *data = "forty two";

that "forty two" is readonly data; and you can't change what the pointer data points to whether directly or through a function call.

To get a 'string' initialized from a literal constant, instead of assigning a pointer to the literal constant, copy the characters to an array

char data[] = "forty two";

Now data is an array of 10 characters (9 for the letters and space + 1 for the NUL terminator) which you can change at will.

like image 26
pmg Avatar answered Dec 07 '22 17:12

pmg