/*
The memory of array should be obtained by malloc with only one cell initially.
Double size whenever insertion-on-full
Alloc double size, Copy the current data, and then Insert the new data
Each record has three fields:
char name [16]
int age
enum {female, male} sex
The input is like "Peter Wang", 35, female
Each line of the input is a record to be inserted
Output:
After insertion insert record, name=XXX,age=NN,sex=male;
When insertion-to-full: output message "queue/stack full, allocate double size NN"
*/
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cctype>
#define N 1000
using namespace std;
typedef struct {
char name[N];
int age;
enum {female, male} sex;
} DATA;
bool check(char *name, char *age, char *sex){
int space=0, i;
if(name == NULL || age == NULL || sex == NULL){ //是否有缺少資料
cout<<"Wrong input format"<<endl;
return false;
}
for(i = 0; i < strlen(age); i++){ //age
if(age[i] == ' ') {
space++;
}
else if(!isdigit(age[i])){
printf("The age entered is not a number.");
return false;
}
}
if(space == (int)strlen(age)){
printf("Only spaces in age.");
return false;
}
for(i=0; i<strlen(sex); i++){ //sex
if(!strcasecmp(sex+i, "female") && !strcasecmp(sex+i, "male"))
break;
if(i == strlen(sex)){
cout<<"Wrong sex";
return false;
}
if(!isalpha(sex[i]) && sex[i] != ' '){
cout<<"Wrong sex";
return false;
}
}
return true;
}
void copy(char *name, char *age, char *sex, int now, DATA *record){
//name
char str[N];
int i, num=0; //num記錄新字串目前位置
for(i=0; i<strlen(name); i++){
if(name[i] != '"') //移除雙引號
str[num++] = name[i];
}
str[num] = '\0';
strcpy((record+now)->name, str);
//age
int year = atoi(age);
(record+now)->age = year;
//sex
if(strcasecmp(sex, "female"))
(record+now)->sex = DATA::female;
else
(record+now)->sex = DATA::male;
}
int main(){
ios::sync_with_stdio(0);
char input[N];
int capacity=1, now=0; //capacity表示現在容量, now表示現在有幾筆資料
DATA *record = (DATA *)malloc(sizeof(DATA)*capacity); //利用malloc取記憶體
while(gets(input) != NULL){
if(now == capacity){ //空間已滿
DATA *temp;
temp = (DATA *)realloc(record, sizeof(DATA) * capacity * 2); //需要兩倍大, 使用realloc調整
if(temp == NULL){ //沒有拿到空間
cout<<"Malloc failed. Program ends now\n";
return 0;
}
else //有拿到空間
cout<<"queue/stack full, allocate double size "<<capacity * 2<<endl;
free(record); //free舊資料
record=temp;
capacity *= 2;
}
char *name_start, *age_start, *sex_start;
name_start = strtok(input, ",");
age_start = strtok(NULL, ",");
sex_start = strtok(NULL, "\n");
if(!check(name_start, age_start, sex_start))
continue;
else
copy(name_start, age_start, sex_start, now, record);
//cout<<(record)->name<<endl;
now++;
}
return 0;
}
LyoKIFRoZSBtZW1vcnkgb2YgYXJyYXkgc2hvdWxkIGJlIG9idGFpbmVkIGJ5IG1hbGxvYyB3aXRoIG9ubHkgb25lIGNlbGwgaW5pdGlhbGx5LgogRG91YmxlIHNpemUgd2hlbmV2ZXIgaW5zZXJ0aW9uLW9uLWZ1bGwKIEFsbG9jIGRvdWJsZSBzaXplLCBDb3B5IHRoZSBjdXJyZW50IGRhdGEsIGFuZCB0aGVuIEluc2VydCB0aGUgbmV3IGRhdGEKIAogRWFjaCByZWNvcmQgaGFzIHRocmVlIGZpZWxkczoKIGNoYXIgbmFtZSBbMTZdCiBpbnQgYWdlCiBlbnVtIHtmZW1hbGUsIG1hbGV9IHNleAogCiBUaGUgaW5wdXQgaXMgbGlrZSAiUGV0ZXIgV2FuZyIsIDM1LCBmZW1hbGUKIEVhY2ggbGluZSBvZiB0aGUgaW5wdXQgaXMgYSByZWNvcmQgdG8gYmUgaW5zZXJ0ZWQKIAogT3V0cHV0OgogQWZ0ZXIgaW5zZXJ0aW9uIGluc2VydCByZWNvcmQsICBuYW1lPVhYWCxhZ2U9Tk4sc2V4PW1hbGU7CiBXaGVuIGluc2VydGlvbi10by1mdWxsOiBvdXRwdXQgbWVzc2FnZSAicXVldWUvc3RhY2sgZnVsbCwgYWxsb2NhdGUgZG91YmxlIHNpemUgTk4iCiAqLwoKI2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjY3R5cGU+CiNkZWZpbmUgTiAxMDAwCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBjaGFyIG5hbWVbTl07CiAgICBpbnQgYWdlOwogICAgZW51bSB7ZmVtYWxlLCBtYWxlfSBzZXg7Cn0gREFUQTsKCmJvb2wgY2hlY2soY2hhciAqbmFtZSwgY2hhciAqYWdlLCBjaGFyICpzZXgpewogICAgaW50IHNwYWNlPTAsIGk7CiAgICBpZihuYW1lID09IE5VTEwgfHwgYWdlID09IE5VTEwgfHwgc2V4ID09IE5VTEwpeyAgLy/mmK/lkKbmnInnvLrlsJHos4fmlpkKICAgICAgICBjb3V0PDwiV3JvbmcgaW5wdXQgZm9ybWF0Ijw8ZW5kbDsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAKICAgIGZvcihpID0gMDsgaSA8IHN0cmxlbihhZ2UpOyBpKyspeyAgIC8vYWdlCiAgICAgICAgaWYoYWdlW2ldID09ICcgJykgewogICAgICAgICAgICBzcGFjZSsrOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKCFpc2RpZ2l0KGFnZVtpXSkpewogICAgICAgICAgICBwcmludGYoIlRoZSBhZ2UgZW50ZXJlZCBpcyBub3QgYSBudW1iZXIuIik7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBpZihzcGFjZSA9PSAoaW50KXN0cmxlbihhZ2UpKXsKICAgICAgICBwcmludGYoIk9ubHkgc3BhY2VzIGluIGFnZS4iKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAKICAgIGZvcihpPTA7IGk8c3RybGVuKHNleCk7IGkrKyl7ICAgLy9zZXgKICAgICAgICBpZighc3RyY2FzZWNtcChzZXgraSwgImZlbWFsZSIpICYmICFzdHJjYXNlY21wKHNleCtpLCAibWFsZSIpKQogICAgICAgICAgICBicmVhazsKICAgICAgICBpZihpID09IHN0cmxlbihzZXgpKXsKICAgICAgICAgICAgY291dDw8Ildyb25nIHNleCI7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYoIWlzYWxwaGEoc2V4W2ldKSAmJiBzZXhbaV0gIT0gJyAnKXsKICAgICAgICAgICAgY291dDw8Ildyb25nIHNleCI7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfQoKdm9pZCBjb3B5KGNoYXIgKm5hbWUsIGNoYXIgKmFnZSwgY2hhciAqc2V4LCBpbnQgbm93LCBEQVRBICpyZWNvcmQpewogICAgCiAgICAvL25hbWUKICAgIGNoYXIgc3RyW05dOwogICAgaW50IGksIG51bT0wOyAgIC8vbnVt6KiY6YyE5paw5a2X5Liy55uu5YmN5L2N572uCiAgICBmb3IoaT0wOyBpPHN0cmxlbihuYW1lKTsgaSsrKXsKICAgICAgICBpZihuYW1lW2ldICE9ICciJykgICAgLy/np7vpmaTpm5nlvJXomZ8KICAgICAgICAgICAgc3RyW251bSsrXSA9IG5hbWVbaV07CiAgICB9CiAgICBzdHJbbnVtXSA9ICdcMCc7CiAgICBzdHJjcHkoKHJlY29yZCtub3cpLT5uYW1lLCBzdHIpOwogICAgCiAgICAvL2FnZQogICAgaW50IHllYXIgPSBhdG9pKGFnZSk7CiAgICAocmVjb3JkK25vdyktPmFnZSA9IHllYXI7CiAgICAKICAgIC8vc2V4CiAgICBpZihzdHJjYXNlY21wKHNleCwgImZlbWFsZSIpKQogICAgICAgIChyZWNvcmQrbm93KS0+c2V4ID0gREFUQTo6ZmVtYWxlOwogICAgZWxzZQogICAgICAgIChyZWNvcmQrbm93KS0+c2V4ID0gREFUQTo6bWFsZTsKfQoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2hhciBpbnB1dFtOXTsKICAgIGludCBjYXBhY2l0eT0xLCBub3c9MDsgIC8vY2FwYWNpdHnooajnpLrnj77lnKjlrrnph48sIG5vd+ihqOekuuePvuWcqOacieW5vuethuizh+aWmQogICAgREFUQSAqcmVjb3JkID0gKERBVEEgKiltYWxsb2Moc2l6ZW9mKERBVEEpKmNhcGFjaXR5KTsgICAvL+WIqeeUqG1hbGxvY+WPluiomOaGtumrlAogICAgd2hpbGUoZ2V0cyhpbnB1dCkgIT0gTlVMTCl7CiAgICAgICAgaWYobm93ID09IGNhcGFjaXR5KXsgICAgLy/nqbrplpPlt7Lmu78KICAgICAgICAgICAgREFUQSAqdGVtcDsKICAgICAgICAgICAgdGVtcCA9IChEQVRBICopcmVhbGxvYyhyZWNvcmQsIHNpemVvZihEQVRBKSAqIGNhcGFjaXR5ICogMik7ICAgLy/pnIDopoHlhanlgI3lpKcsIOS9v+eUqHJlYWxsb2Poqr/mlbQKICAgICAgICAgICAgaWYodGVtcCA9PSBOVUxMKXsgICAgLy/mspLmnInmi7/liLDnqbrplpMKICAgICAgICAgICAgICAgIGNvdXQ8PCJNYWxsb2MgZmFpbGVkLiBQcm9ncmFtIGVuZHMgbm93XG4iOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAgICAvL+acieaLv+WIsOepuumWkwogICAgICAgICAgICAgICAgY291dDw8InF1ZXVlL3N0YWNrIGZ1bGwsIGFsbG9jYXRlIGRvdWJsZSBzaXplICI8PGNhcGFjaXR5ICogMjw8ZW5kbDsKICAgICAgICAgICAgZnJlZShyZWNvcmQpOwkvL2ZyZWXoiIros4fmlpkKICAgICAgICAgICAgcmVjb3JkPXRlbXA7CiAgICAgICAgICAgIGNhcGFjaXR5ICo9IDI7CiAgICAgICAgfQogICAgICAgIGNoYXIgKm5hbWVfc3RhcnQsICphZ2Vfc3RhcnQsICpzZXhfc3RhcnQ7CiAgICAgICAgbmFtZV9zdGFydCA9IHN0cnRvayhpbnB1dCwgIiwiKTsKICAgICAgICBhZ2Vfc3RhcnQgPSBzdHJ0b2soTlVMTCwgIiwiKTsKICAgICAgICBzZXhfc3RhcnQgPSBzdHJ0b2soTlVMTCwgIlxuIik7CiAgICAgICAgaWYoIWNoZWNrKG5hbWVfc3RhcnQsIGFnZV9zdGFydCwgc2V4X3N0YXJ0KSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgZWxzZQogICAgICAgICAgICBjb3B5KG5hbWVfc3RhcnQsIGFnZV9zdGFydCwgc2V4X3N0YXJ0LCBub3csIHJlY29yZCk7CiAgICAgICAgLy9jb3V0PDwocmVjb3JkKS0+bmFtZTw8ZW5kbDsKICAgICAgICBub3crKzsKICAgIH0KICAgIHJldHVybiAwOwp9