简体   繁体   中英

How can I implement a function to concatenate to a char* and not char array?

How can I implement a function that will concatenate something to a char* (not char array)? Example of what I want:

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

int main() {
  char* current_line;
  char temp[1];
  sprintf(temp, "%c", 'A');
  // This causes a seg fault. I of course don't want that, so how do I get this to work properly?
  strcat(current_line, temp);
  return 0;
}

How can I fix this to work properly (and please, tell me if I need to add anything to my question or point me in the right direction because I couldn't find anything)?

Edit: I made this but it seg faults

char* charpointercat(char* mystr, char* toconcat) {
  char ret[strlen(mystr) + 1];
  for(int i = 0; mystr[i] != '\0'; i++) {
    ret[i] = mystr[i];
  }
  return ret;
}

You have 3 problems:

  1. You do not allocate memory for current_line at all!
  2. You do not allocate enough memory for temp .
  3. You return a pointer to a local variable from charpointercat .

The first one should be obvious, and was explained in comments:
char *current_line only holds a pointer to some bytes, but you need to allocate actual bytes if you want to store something with a function like stracat .

For the secoond one, note that sprintf(temp, "%c", 'A'); needs at least char temp[2] as it will use one byte for the "A", and one byte for terminating null character.

Since sprintf does not know how big temp is, it writes beyond it and that is how you get the segfault.

As for your charpointercat once the function exits, ret no longer exists.

To be more precise:
An array in C is represented by a pointer (a memory address) of its first item (cell).

So, the line return ret; does not return a copy of all the bytes in ret but only a pointer to the first byte.

But that memory address is only valid inside charpointercat function.
Once you try to use it outside, it is "undefined behavior", so anything can happen, including segfault.

There are two ways to fix this:

  1. Learn how to use malloc and allocate memory on the heap.
  2. Pass in a third array to the function so it can store the result there (same way you do with sprintf ).

From the first code you posted it seems like you want to concatenate a char to the end of a string... This code will return a new string that consists of the first one followed by the second, it wont change the parameter.

char* charpointercat(char* mystr, char toconcat) {
    char *ret = (char*) malloc(sizeof(char)*(strlen(mystr) + 2));
    int i;
    for(i = 0; mystr[i] != '\0'; i++) {
        ret[i] = mystr[i];
     }
     ret[i] = toconcat;
     ret[i + 1] = '\0';
     return ret;
 }

This should work:

char* charpointercat(char* mystr, char* toconcat) {
  size_t l1,l2;
  //Get lengths of strings
  l1=strlen(mystr);
  l2=strlen(toconcat);
  //Allocate enough memory for both
  char * ret=malloc(l1+l2+1);
  strcpy(ret,mystr);
  strcat(ret,toconcat);
  //Add null terminator
  ret[l1+l2]='\0';
  return ret;
}

int main(){
  char * p=charpointercat("Hello","World");
  printf("%s",p);
  //Free the memory
  free(p); 
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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