Home > Software design >  Why strcat doesn't work with pointer in C?
Why strcat doesn't work with pointer in C?

Time:01-01

When I execute this with a normal array it's working but with a pointer it doesn't.

#include <stdio.h>
#include <string.h>
int main()
{
    char source[]="Agdhefhe";
    char *accum = "";
    for(int i=0;i<=sizeof(*source)/sizeof(char);i  )
        {
            for(int j=0; j<i; j  )
            strcat(accum,source);
        }
        
    printf("%s",accum);
    return 0;
}

CodePudding user response:

The pointer accum points to the constant initialiser which has length 1. The result of both writing to a to the initialiser's data area and overrunning the allocated space is undefined.

accum must point to a writable region with sufficient space allocated to accommodate the final string.

CodePudding user response:

To get it right you need to allocation enough space for the destination to write to.

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

int main(void) {
    char source[] = "Agdhefhe";
    size_t sz = 360;
    char *accum = (char *) malloc(sz   1);
    *accum = '\0';  // needed for first strcat call
    for (int i = 0; i <= sizeof(*source) / sizeof(char); i  )
        for (int j = 0; j < i; j  )
            strncat(accum, source, sz);  // strncat used to not write too much

    printf("%s", accum);
    free(accum);
    return 0;
}

This program writes Agdhefhe but can be simplified to

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

int main(void) {
    char const source[] = "Agdhefhe";
    size_t sz = 360;
    char *accum = (char *) malloc(sz   1);
    *accum = '\0';  // needed for first strcat call
    strncat(accum, source, sz);

    printf("%s", accum);
    free(accum);
    return 0;
}

But if you wanted to duplicate the string a number of times you write:

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

int main(void) {
    char const source[] = "Agdhefhe";
    size_t sz = 360;
    char *accum = (char *) malloc(sz   1);
    *accum = '\0';  // needed for first strcat call
    for (int i = 0; i <= sizeof(source) / sizeof(char); i  )  // the change is here
        for (int j = 0; j < i; j  )
            strncat(accum, source, sz);

    printf("%s", accum);
    free(accum);
    return 0;
}

This writes AgdhefheAgdhefheAgdhefheAgdhefhe...Agdhefhe (360 characters).

  • Related