Programming Exercise Write a menu driven program that has the following menu: 1) Get a cString 2) Copy one cString into another (strcpy) 3) Concatenate one cString onto the Original cString (strcat) 4) Finds the length of a cString (strlen) 5) Finds the substring in a cString (strstr) 6) Reverse a cString (strrev) 7) Case insensitive cString compare (stricmp) 8) Delete a Portion of the String 9) Insert another String into the First String 10) Create a substring 11) Find Index of Sub-String 12) Exit Explanation Option 8: This function changes the value of string by deleting num_char characters starting at position start. Option 9: This function changes the value of string by inserting insert_string starting at start position. Option 10: This function changes the value of the cString by making it a substring of the original cString. The substring starts at position start and includes num_char characters. Option 11: This function scans through cString to find the first occurrence of the substring. The function then returns the index within cString of the first character of the matched substring. Stipulations • Don’t use array notation, pointer notation only. • Don’t use any predefined string functions. • You may use any functions written for this exercise to complete other functions. Hint: You can use strcpy to easily write strcat. |
#include <iostream> #include <string> using std::cout; using std::cin; using std::endl; const int SIZE = 42; void MenuSelection(char * src_ptr, char * dest_ptr, int * counter_ptr, int * counter2_ptr); void GetString(char * src_ptr, char * dest_ptr); void StrCpy(char * src_ptr, char * dest_ptr); void StrCat(char * src_ptr, char * dest_ptr); void Strlen(char * src_ptr, int * counter_ptr); void StrStr(char * src_ptr, char * dest_ptr, int * counter_ptr, int * counter2_ptr); int main() { char dest[SIZE] = { '\0' }; char src[SIZE] = { '\0' }; int counter = 0; int counter2 = 0; char * src_ptr = src; char * dest_ptr = dest; int * counter_ptr = &counter; int * counter2_ptr = &counter2; MenuSelection(src_ptr, dest_ptr, counter_ptr); return 0; } void MenuSelection(char * src_ptr, char * dest_ptr, int * counter_ptr, int * counter2_ptr) { int choice = 0; while (choice != 12) { cout << "Options\n\n" << "1. Get a cString\n" << "2. Copy on cString into another (strcpy)\n" << "3. Concatenate one cString onto the Original cString (strcat)\n" << "4. Finds the length of a cString (strlen)\n" << "5. Finds the substring in a cString (strstr)\n" << "6. Revers a cString (strrev)\n" << "7. Case insensitive cString compare (stricmp)\n" << "8. Delete a Portion of the String\n" << "9. Insert another String into the First String\n" << "10. Create a substring\n" << "11. Find Index of Sub-String\n" << "12. Exit\n\n"; cout << "Select Option: "; cin >> choice; switch (choice) { case (1) : { GetString(src_ptr, dest_ptr); cout << "\nThe String you entered is: "; while (*src_ptr != NULL) { cout << *src_ptr++; } cout << "\n\n"; break; } case (2) : { GetString(src_ptr, dest_ptr); StrCpy(src_ptr, dest_ptr); cout << "\nThe String you entered is: "; while (*src_ptr != NULL) { cout << *src_ptr++; } cout << "\n\nIt has been copied to the destination: "; while (*dest_ptr != NULL) { cout << *dest_ptr++; } cout << "\n\n"; break; } case (3) : { for (int i = 0; i < 2; i++) { GetString(src_ptr, dest_ptr); StrCat(src_ptr, dest_ptr); } cout << "\n"; while (*dest_ptr != NULL) { cout << *dest_ptr++; } cout << "\n\n"; break; } case (4) : { *counter_ptr = 0; GetString(src_ptr, dest_ptr); Strlen(src_ptr, counter_ptr); cout << "\n"; cout << "The string length is " << *counter_ptr; cout << "\n\n"; break; } case (5) : { for (int i = 0; i < 2; i++) { GetString(src_ptr, dest_ptr); if (i == 0) { StrCpy(src_ptr, dest_ptr); } } StrStr(src_ptr, dest_ptr, counter_ptr, counter2_ptr); break; } case (6) : { break; } case (7) : { break; } case (8) : { break; } case (9) : { break; } case (10) : { break; } case (11) : { break; } case (12) : { break; } default: { cout << "\nInvalid option\n\n"; } } } } void GetString(char * src_ptr, char * dest_ptr) { cout << "\nEnter string: "; cin.ignore(cin.rdbuf()->in_avail()); cin.getline(src_ptr, SIZE - 2); cin.ignore(cin.rdbuf()->in_avail()); } void StrCpy(char * src_ptr, char * dest_ptr) { while (*dest_ptr++ = *src_ptr++); } void StrCat(char * src_ptr, char * dest_ptr) { for (; *dest_ptr != '\0'; *dest_ptr++); StrCpy(src_ptr, dest_ptr); } void Strlen(char * src_ptr, int * counter_ptr) { for (; *src_ptr++ != '\0'; (*counter_ptr)++); // increment counter + 1 until src = NULL } void StrStr(char * src_ptr, char * dest_ptr, int * counter_ptr, int * counter2_ptr) { int start = 0; int end = 0; int flag_count = 0; int start_dest = 0; Strlen(src_ptr, counter_ptr); for (; *dest_ptr++ != '\0'; (*counter2_ptr)++); for (int i = 0; i < *counter2_ptr || flag_count == *counter_ptr; i++) { if (toupper(*dest_ptr) == toupper(*src_ptr)) { if (flag_count == 1) { start_dest = dest_ptr; // Doesn't work? } flag_count++; dest_ptr++; src_ptr++; } else if (toupper(*dest_ptr) != toupper(*src_ptr)) { start_dest = 0; flag_count = 0; dest_ptr++; src_ptr = 0; } } if (flag_count == *counter2_ptr) { cout << "Substring starts at "; } else { cout << "Substring is not located in the string.\n\n"; } } |
int start = 0; int end = 0; int flag_count = 0; //If a char matches a flag is raised int counter = 0; int counter2 = 0; char * start_dest = 0; counter = Strlen(src_ptr); counter2 = Strlen(dest_ptr); for (int i = 0; i < counter2 && flag_count != counter; i++) { if (toupper(*dest_ptr) == toupper(*src_ptr)) { if (flag_count == 1) //When first character is matched set { // start destination start_dest = dest_ptr - 1; } flag_count++; dest_ptr++; src_ptr++; } else if (toupper(*dest_ptr) != toupper(*src_ptr)) { start_dest = 0; dest_ptr++; src_ptr = src_ptr - flag_count; //Sub ptr count from flags it has been passed flag_count = 0; //Second character doesn't match reset } } if (flag_count == counter) { cout << "\nSubstring starts at " << start_dest << "\n\n"; } else { start_dest = nullptr; //If sub strign not found return nullptr instead of value cout << "\nSubstring is not located in the string.\n\n"; } return start_dest; } |