I am trying to get this program to work, when it runs, any command, aside from exit causes the function mylowercase
to run. I have no clue, as I have been looking at this for a few days and I cannot find where the problem is. Any help on this one would be huge.
Code:
//String Processor with Array of Structures and Commands.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <cstring>
struct String_Handler{
char *name;
char *message;
char *(*mystringfunction)(char *,const char *);
};
char *mystrcopy(char *dst, const char *src){
char *rez=dst;
for(;(*dst=*src)!='\0';src++,dst++);
return rez;
}
char *myuppercase(char *dst,const char *src){
char *rez=dst;
for(;*src!='\0';*dst=(*src>='a'&&*src<='z')?*src+('A'-'a'):*src,src++,dst++);
*dst='\0';
return rez;
}
char *mylowercase(char *dst, const char *src){
char *rez=dst;
for(;*src!='\0';*dst=(*src>='A'&&*src<='Z')?*src+('a'-'A'):*src,src++,dst++);
*dst='\0';
return rez;
}
char *myrighttrim(char *dst, const char *src){
char *rez=dst;
for(;*src!='\0'&& *src==' ';src++);
for(;(*dst=*src)!='\0';src++,dst++);
return rez;
}
char *myreverse(char *dst, const char *src){
char current_char;
char *rez=dst;
if(*src!='\0'){
current_char=*src;
dst=myreverse(dst,src+1);
*dst++=current_char;
*dst='\0';
}
return dst;
}
int binary_search_iterative(const String_Handler sh_table[],int first_index,int last_index,char *comm){
int middle;
while(first_index<=last_index){
middle=(last_index+first_index)/2;
if(strcmp(comm,sh_table[middle].name)==0) return middle; //successfully found element!
if(strcmp(comm,sh_table[middle].name)==-1)
last_index=middle-1;
else
first_index=middle+1;
}
return -1; //element not found!
}
bool string_processor(char *comm,char *dst, char *src, String_Handler sh_table[],int table_size){
//for(int i=0;i<table_size&&strcmp(comm,sh_table[i].name)!=0;i++);
int i;
if(i=binary_search_iterative(sh_table,0,table_size-1,comm)!=-1){
std::cout<<sh_table[i].message<<(sh_table[i].mystringfunction)(dst, src)<<std::endl;
return true;
}
else
return false;
}
void get_command(char *command){
std::cout<<"Input command(copy,upper,lower,right,reverse or exit):";
std::cin>>command;
std::cout<<std::endl;
return;
}
int main()
{
String_Handler string_handler_table[5];
string_handler_table[0].name="copy";
string_handler_table[0].message="The copy of the string is: ";
string_handler_table[0].mystringfunction=mystrcopy;
string_handler_table[4].name="upper";
string_handler_table[4].message="The upper case version of the string is: ";
string_handler_table[4].mystringfunction=myuppercase;
string_handler_table[1].name="lower";
string_handler_table[1].message="The lower case version of the string is: ";
string_handler_table[1].mystringfunction=mylowercase;
string_handler_table[3].name="right";
string_handler_table[3].message="The right trimmed version of the string is:";
string_handler_table[3].mystringfunction=myrighttrim;
string_handler_table[2].name="reverse";
string_handler_table[2].message="The reversed version of the string is:";
string_handler_table[2].mystringfunction=myreverse;
char *str=" This is the test string!";
char rez[100];
char command[10]="";
get_command(command);
while(strcmp(command,"exit")!=0){
if(!string_processor(command,rez,str,string_handler_table,sizeof string_handler_table/sizeof (String_Handler)))
std::cout<<"Not a legal command!"<<std::endl;
get_command(command);
}
return 0;
}