Mega Code Archive

 
Categories / C / String
 

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