This is just an interesting program I ever come across in an interview, and I almost spent 3-4 hours to completely understanding this after the interview. Yeah. I'm such a bad programmer. To make life easier, I added comments in the complex legs of the code.
Please leave a comment if I miss to add something or if you are not able to understand it.
Output:
Source: Stackoverflow
Please leave a comment if I miss to add something or if you are not able to understand it.
#include <stdio.h> #include <string.h> #define SIZE_OF_STRING 50 #define SIZE_OF_DELIMITER 5 /* Make the temp_ptr as static, so it will hold the previous pointing address */ static char *temp_ptr = NULL; char *string_token(char *str, char *delimiter) { char *final_ptr = NULL; /* Flag has been defined as static to avoid the parent function loop * runs infinitely after reaching end of string. */ static int flag = 0; int i, j; if (delimiter == NULL) { return NULL; } /* If flag is 1, it will denote the end of the string */ if (flag == 1) { return NULL; } /* The below condition is to avoid temp_ptr is getting assigned * with NULL string from the parent function main. Without * the below condition, NULL will be assigned to temp_ptr * and final_ptr, so accessing these pointers will lead to * segmentation fault. */ if (str != NULL) { temp_ptr = str; } /* Before function call ends, temp_ptr should move to the next char, * so we can't return the temp_ptr. Hence, we introduced a new pointer * final_ptr which points to temp_ptr. */ final_ptr = temp_ptr; printf("%s %d str: %s delimiter: %s length: %ld temp_ptr: %s strlen: %ld" " final_ptr: %s \n",__func__, __LINE__, str, delimiter, strlen(delimiter), temp_ptr, strlen(temp_ptr), final_ptr); for (i = 0; i <= strlen(temp_ptr); i++) { for (j = 0; j < strlen(delimiter); j++) { if (temp_ptr[i] == '\0') { /* If the flag is not set, both the temp_ptr and flag_ptr * will be holding string "Jasmine" which will make parent * to call this function string_token infinitely. */ flag = 1; return final_ptr; } if ((temp_ptr[i] == delimiter[j])) { /* NULL character is assigned, so that final_ptr will return * til NULL character. Here, final_ptr points to temp_ptr. */ temp_ptr[i] = '\0'; temp_ptr += i+1; return final_ptr; } } } /* You will somehow end up here if for loop condition fails. * If this function doesn't return any char pointer, it will * lead to segmentation fault in the parent function. */ return NULL; } int main() { char str[SIZE_OF_STRING] = "shirley|Rose|Jasmine"; char *token = NULL; char del[SIZE_OF_DELIMITER] = "|"; token = string_token(str, del); while (token != NULL) { printf("token %s\n", token); token = string_token(NULL, del); } return 0; }
Output:
string_token 46 str: shirley|Rose|Jasmine delimiter: | length: 1 temp_ptr: shirley|Rose|Jasmine strlen: 20 final_ptr: shirley|Rose|Jasmine
token shirley
string_token 46 str: (null) delimiter: | length: 1 temp_ptr: Rose|Jasmine strlen: 12 final_ptr: Rose|Jasmine
token Rose
string_token 46 str: (null) delimiter: | length: 1 temp_ptr: Jasmine strlen: 7 final_ptr: Jasmine
token Jasmine
|
Source: Stackoverflow
Comments
Post a Comment