Join array of strings into a single string
/* Beginning C, Third Edition By Ivor Horton ISBN: 1-59059-253-0 Published: Apr 2004 Publisher: apress */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_STRINGS 100 /* Maximum string count */ #define BUFFER_SIZE 50 /* Initial input buffer size */ char* join_strings(char *strings[], int count); /* Joins array of strings into a single string */ char* read_string(); /* Reads a string from the keyboard */ void main() { char *pStrings[MAX_STRINGS]; /* Array of pointers to strings */ char *joined_strings = NULL; /* Pointer to the joined string */ int count = 0; /* Number of strings entered */ char answer = 'y'; /* Confirms more input */ char terminator = '*'; /* Terminator for string entry */ int i = 0; /* Read the strings */ while(count<MAX_STRINGS && tolower(answer)=='y') { printf("Enter a string:\n"); pStrings[count++] = read_string(terminator); printf("Do you want to enter another: "); scanf(" %c", &answer); fflush(stdin); /* Lose newline following character entry */ } joined_strings = join_strings(pStrings, count); printf("\nHere are the strings as a single string:\n%s\n", joined_strings); free(joined_strings); /* Free memory for joined strings */ for(i = 0 ; i<count ; i++) /* Free memory for original strings */ free(pStrings[i]); } /************ * Function to join an array of strings * * this function allocates memory that must be freed by the caller * ************/ char* join_strings(char *strings[], int count) { char* str = NULL; /* Pointer to the joined strings */ size_t total_length = 0; /* Total length of joined strings */ size_t length = 0; /* Length of a string */ int i = 0; /* Loop counter */ /* Find total length of joined strings */ for(i = 0 ; i<count ; i++) { total_length += strlen(strings[i]); if(strings[i][strlen(strings[i])-1] != '\n') ++total_length; /* For newline to be added */ } ++total_length; /* For joined string terminator */ str = (char*)malloc(total_length); /* Allocate memory for joined strings */ str[0] = '\0'; /* Empty string we can append to */ /* Append all the strings */ for(i = 0 ; i<count ; i++) { strcat(str, strings[i]); length = strlen(str); /* Check if we need to insert newline */ if(str[length-1] != '\n') { str[length] = '\n'; /* Append a newline */ str[length+1] = '\0'; /* followed by terminator */ } } return str; } /******************** * Reads a string of any length. * * The string is terminated by the chracter passed as the argument. * * Memory is allocated to hold the string and must be freed by the caller. * ********************/ char* read_string(char terminator) { char *buffer = NULL; /* Pointer to the input buffer */ int buffersize = BUFFER_SIZE; /* Current buffer capacity */ int length = 0; /* String length */ char *temp = NULL; /* Temporary buffer pointer */ int i = 0; /* Loop counter */ buffer = (char*)malloc(BUFFER_SIZE); /* Initial buffer */ /* Read the string character by character */ for(;;) { /* Check for string terminator */ if((buffer[length] = getchar()) == terminator) break; else ++length; /* Check for buffer overflow */ if(length == buffersize) { buffersize += BUFFER_SIZE; /* Increase buffer size */ temp = (char*)malloc(buffersize); /* Allocate new buffer */ /* Copy characters from old buffer to new */ for(i = 0 ; i<length ; i++) temp[i] = buffer[i]; free(buffer); /* Free memory for old buffer */ buffer = temp; /* Store new buffer address */ temp = NULL; /* Rest temp pointer */ } } buffer[length] = '\0'; /* Append string terminator */ temp = (char*)malloc(length+1); /* Allocate exact memory required for string */ strcpy(temp, buffer); /* Copy the string */ free(buffer); /* Free the buffer memory */ return temp; }