You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
304 lines
6.6 KiB
304 lines
6.6 KiB
#define LARGEST_DYNAMIC_MEMORY 65535 /* define the largest memory for a str in as1_getchar_plus function */ |
|
|
|
/* function for detect the keyborad to wait for a keyboard event and return it with ASCII */ |
|
int input__detect_input_ASCII() |
|
{ |
|
int nKey; |
|
|
|
/* clear former cache */ |
|
fflush(stdin); |
|
|
|
/* get key value */ |
|
nKey = _getch(); |
|
|
|
return nKey; |
|
} |
|
|
|
/* function for get arrow event */ |
|
int input__get_arrow() |
|
{ |
|
int nVal=0; |
|
|
|
while(1) |
|
{ |
|
nVal=input__detect_input_ASCII(); |
|
|
|
if(nVal==224) |
|
{ |
|
/* get arraw value */ |
|
int nKey=input__detect_input_ASCII(); |
|
|
|
if(nKey==75) |
|
return -1; |
|
if(nKey==77) |
|
return 1; |
|
if(nKey==72) |
|
return -1; |
|
if(nKey==80) |
|
return 1; |
|
else |
|
return 0; |
|
} |
|
|
|
if(nVal==13) |
|
return 6; |
|
if(nVal==27) |
|
return 9; |
|
} |
|
} |
|
|
|
/* function to get a char type string as needed */ |
|
char *input__as1_getchar_plus(char *p) |
|
{ |
|
|
|
char *pTmp; |
|
|
|
/* apply for a large dynamic memory for the first time storage */ |
|
if((pTmp=(char *)malloc(LARGEST_DYNAMIC_MEMORY))==NULL) |
|
{ |
|
printf("Application memory failure...\n"); |
|
exit(0); /* if fail, exit the input__as1_getchar_plus function with the return value of 0 */ |
|
} |
|
|
|
/* get words from keyboard to pTemp */ |
|
gets(pTmp); |
|
|
|
/* apply for a dynamic memory as needed */ |
|
if((p=(char *)malloc(strlen(pTmp)+1))==NULL) |
|
{ |
|
printf("Application memory failure...\n"); |
|
exit(0); /* if fail, exit the input__as1_getchar_plus function with the return value of 0 */ |
|
} |
|
|
|
/* copy str from pTmp to p */ |
|
strcpy(p,pTmp); |
|
|
|
/* free the Tmp memory */ |
|
free(pTmp); |
|
|
|
return p; |
|
} |
|
|
|
|
|
/* function for process space, (remove begining space(1), convert middle multi-space into one space(1) remove middle space(2), remove ending space(1), *string) */ |
|
char *input__as1_process_space(int nStrt, int nMdd, int nEnd, char *str) |
|
{ |
|
int i,pston,iTmp; |
|
|
|
/* process the begining space */ |
|
if(nStrt==1) |
|
{ |
|
i=-1; |
|
/* figure the first not space char position */ |
|
while(isspace(str[++i])); |
|
|
|
/* move the not space char to the begining */ |
|
for(pston=i;pston<strlen(str);pston++) |
|
str[pston-i]=str[pston]; |
|
|
|
/* give a stop sign at the end of the new char */ |
|
str[pston-i]='\0'; |
|
|
|
} |
|
|
|
/* process the ending space */ |
|
if(nEnd==1) |
|
{ |
|
i=0; |
|
/* figure the last not space char position */ |
|
while(isspace(str[strlen(str)-(++i)])); |
|
|
|
/* give a stop sign at the end of the new char */ |
|
str[strlen(str)-i+1]='\0'; |
|
|
|
} |
|
|
|
/* process the middle space::combine */ |
|
if(nMdd==1) |
|
{ |
|
i=0; |
|
|
|
do |
|
{ |
|
/* find the first space position */ |
|
while(!isspace(str[i++])&&str[i]!='\0'); |
|
|
|
/* deal with situation that there are one more spaces */ |
|
if(isspace(str[i])) |
|
{ |
|
/* storage the first space position in pston */ |
|
pston=i; |
|
|
|
/* storage the process position to iTmp */ |
|
iTmp=i; |
|
|
|
/* find the end of this space */ |
|
while(isspace(str[++i])); |
|
|
|
/* move the left not space string to the second position of the space */ |
|
for(;i<strlen(str);) |
|
str[pston++]=str[i++]; |
|
|
|
/* give a new end of the processed string */ |
|
str[pston]='\0'; |
|
|
|
/* the process position give back to i */ |
|
i=iTmp; |
|
|
|
} |
|
|
|
} |
|
while(i<strlen(str)); /* process the whole string to combine the multi space to single space */ |
|
|
|
} |
|
|
|
|
|
/* process the middle space::remove */ |
|
if(nMdd==2) |
|
{ |
|
i=0; |
|
|
|
do |
|
{ |
|
/* find the first space position */ |
|
while(!isspace(str[i++])&&str[i]!='\0'); |
|
|
|
/* deal with the situation that there is no space anymore */ |
|
if(str[i]=='\0') |
|
break; |
|
|
|
/* storage the first space position in pston */ |
|
pston=i; |
|
|
|
/* storage the process position to iTmp */ |
|
iTmp=i; |
|
|
|
/* find the end of this space */ |
|
while(isspace(str[++i])); |
|
|
|
/* move the left not space string to the second position of the space */ |
|
for(;i<strlen(str);) |
|
str[pston++-1]=str[i++]; |
|
|
|
/* give a new end of the processed string */ |
|
str[pston-1]='\0'; |
|
|
|
/* the process position give back to i */ |
|
i=iTmp; |
|
|
|
} |
|
while(i<strlen(str)); /* process the whole string to combine the multi space to single space */ |
|
|
|
} |
|
|
|
return str; |
|
} |
|
|
|
/* figure out if the input value is English(with space and num) or Numbers ::type : num(n), char(c),float(f)::return value{success: 1,fail: 0, error:2} */ |
|
int input__as1_jdge_var(char type,char *str) |
|
{ |
|
/* check if the char follow the type one by one */ |
|
int i; |
|
for (i = 0; i < strlen(str); i++) |
|
{ |
|
|
|
switch(type) |
|
{ |
|
/* if exist not char, exit with 0 */ |
|
case 'c': |
|
if(!(((int)str[i]>96&&(int)str[i]<123)||(str[i]>64&&str[i]<91)||((int)str[i]>47&&(int)str[i]<58))) |
|
return 0; |
|
break; |
|
|
|
/* if exist not num, exit with 0 */ |
|
case 'n': |
|
if(!((int)str[i]>47&&(int)str[i]<58)) |
|
return 0; |
|
break; |
|
|
|
/* if exist not float, exit with 0 */ |
|
case 'f': |
|
if(!(((int)str[i]>47&&(int)str[i]<58)||(int)str[i]==46/* include '.' */)) |
|
return 0; |
|
break; |
|
|
|
/* other error condition */ |
|
default: |
|
return 2; |
|
} |
|
|
|
} |
|
|
|
return 1; |
|
} |
|
|
|
char *input__replace_space_with__(char *str) |
|
{ |
|
/* check if the char follow the type one by one */ |
|
int i; |
|
for (i = 0; i < strlen(str); i++) |
|
{ |
|
if((int)str[i]==32) str[i]=95; |
|
} |
|
|
|
return str; |
|
} |
|
|
|
/* function for input and check a name */ |
|
char *input__as1_input_name() |
|
{ |
|
|
|
char *pName=NULL; |
|
|
|
/* preload the state as 0, and clear a var rtrnVal to storage the return value of sub function */ |
|
int state=0, rtrnVal=0; |
|
|
|
|
|
printf("Please input your English User Name...\nUser Name="); |
|
|
|
/* while the state is 0(false), loop the input process */ |
|
do |
|
{ |
|
/* input a name */ |
|
pName=input__as1_getchar_plus(pName); |
|
|
|
/* process the start, middle, end space of input */ |
|
pName=input__as1_process_space(1,0,1,pName); |
|
|
|
/* judge if the name is pure English */ |
|
rtrnVal=input__as1_jdge_var('c',pName); |
|
|
|
/* replace space with _ */ |
|
pName=input__replace_space_with__(pName); |
|
|
|
/* flase situation | the input is not pure*/ |
|
if(!rtrnVal) |
|
printf("\nPlease input an ENGLISH Name!!!\n\nTry Again~\nPlease input your name...\nname="); |
|
|
|
/* success situation */ |
|
else if(rtrnVal==1) |
|
{ |
|
/* exclude the situation of empty input */ |
|
if(!strlen(pName)) |
|
printf("\nIllegal Empty Input!\n\nTry Again~\nPlease just try to type in something...\nname="); |
|
|
|
else if(strlen(pName)>0&&strlen(pName)<3) |
|
printf("\nToo less Input!\n\nTry Again~\nPlease just try to type in more than two characters...\nname="); |
|
|
|
else if(strlen(pName)>10) |
|
printf("\nYour name is too long!\n\nTry Again~\nPlease just try to type in less than TEN characters...\nname="); |
|
/* success */ |
|
else |
|
state=1; |
|
} |
|
|
|
/* the other inner function error situation */ |
|
else if(rtrnVal==2) |
|
printf("\nError with Function input__as1_jdge_var!\nPlease Connect Yimian LIU!!"); |
|
|
|
|
|
}while(state==0); |
|
|
|
return pName; |
|
} |
|
|
|
|