Как я могу сканировать строки с несколькими словами несколько раз в C [не C ++]? - PullRequest
0 голосов
/ 22 июня 2011

Я много раз гуглял, но не могу найти конкретный ответ на свой вопрос / проблему.Я знаю, что fgets () это позволяет, а также get ().Но если я делаю это несколько раз, всегда есть ошибка.Несколько раз означают, например, я хочу попросить его имя, затем его второе имя, затем его фамилию, которая может быть 1 или более строк.

Я думаю, что я получил его с помощью get, так как я не могу сделатьfgets () работает, но в моей программе есть какая-то ошибка.Итак, я хочу попросить лучшего решения, чем то, что я сделал.В любом случае, вот частичный код:

BST *insert(BST *root, BST *temp){
    if(root == NULL) root = temp; //empty
    else{
        temp->parent = root;
        //if true i = 1, else i = 0
        int i = root->employee.emnumber <= temp->employee.emnumber;
        //recurse
        root->child[i] = insert(root->child[i], temp);
    }
    return root;
}

int checknum(BST *root, int num){
    if(root == NULL){
        if(num <= 99999 && num >= 1) return 0;
        else return 1;
    }
    if(root->employee.emnumber == num || num > 99999 || num < 1) return 1;

    int i = root->employee.emnumber <= num;
    checknum(root->child[i], num);
}

BST *add(BST *root){
    int invalid = -1;
    BST *temp = malloc (sizeof (BST) );
    temp->child[0] = temp->child[1] = temp->parent = NULL;

    printf("\n\tADD EMPLOYEE INFORMATION\n");
    printf("\nEnter Employee Number: ");
    scanf("%d", &(temp->employee.emnumber) );
    invalid = checknum(root,temp->employee.emnumber);
    if(invalid) printf("\nInvalid Input!\n(Either your input is not a 5-digit number or the employee number is already in the database)\n\n");
    else{
        printf("\nFull Name| First Name: ");
        getchar();
        gets(temp->employee.emname.fn);
        //printf("%d\n", strlen(temp->employee.emname.fn));
        if(strlen(temp->employee.emname.fn) > max) printf("Invalid Input!\n(Input only %d characters)\n", max);
        else{
            printf("           Middle Name: ");
            gets(temp->employee.emname.mn);
            if(strlen(temp->employee.emname.mn) > max) printf("Invalid Input!\n(Input only %d characters)\n", max);
            else{
                printf("           Last Name: ");
                gets(temp->employee.emname.ln);
                if(strlen(temp->employee.emname.ln) > max) printf("Invalid Input!\n(Input only %d characters)\n", max);
                else{
                    printf("\nBirth Date| Month: ");
                    scanf("%d", &(temp->employee.bdate.month) );
                    printf("            Day: ");
                    scanf("%d", &(temp->employee.bdate.day) );
                    printf("            Year: ");
                    scanf("%d", &(temp->employee.bdate.year) );
                    printf("\nCurrent Address: ");
                    scanf("%s", temp->employee.address);
                    printf("\nMonthly Gross Salary: ");
                    scanf("%d", &(temp->employee.salary) );
                    printf("\nHire Date| Month: ");
                    scanf("%d", &(temp->employee.hired.month) );
                    printf("           Day: ");
                    scanf("%d", &(temp->employee.hired.day) );
                    printf("           Year: ");
                    scanf("%d", &(temp->employee.hired.year) );
                    root = insert(root, temp);
                }
            }
        }
    }
}

Ошибка заключается в том, что если я ввел неверный номер в add.Скажем, я ввел 5 в номер сотрудника, но уже есть номер сотрудника 5, программа скажет, что естьуже сотрудник 5, но если я распечатаю список сотрудников, сотрудника 5 там нет.Повторный ввод 5 в добавлении не предложит вам, потому что он удалил сотрудника 5. Я не знаю, как он удаляется, так как я не вызывал функцию удаления.Пожалуйста, кто-нибудь, помогите мне.

редактировать: я удалил контрольную сумму и сделал поиск в моей функции поиска для удаления: мой код для поиска:

BST *search(BST *root, int x){
    int i;
    if(root == NULL || root->employee.emnumber == x) return(root);
    i = root->employee.emnumber <= x;
    return search(root->child[i], x);
}

и добавить сейчас:

BST *add(BST *root){
    BST *invalid = NULL;
    BST *temp = malloc (sizeof (BST) );
    temp->child[0] = temp->child[1] = temp->parent = NULL;

    printf("\n\tADD EMPLOYEE INFORMATION\n");
    printf("\nEnter Employee Number: ");
    scanf("%d", &(temp->employee.emnumber) );
    if(temp->employee.emnumber > 99999 || temp->employee.emnumber < 1)
        printf("\nInvalid Input!\n(Input only 5-digit number)\n\n");
    else{
        invalid = search(root,temp->employee.emnumber);
        if(invalid != NULL) printf("\nInvalid Input!\n(Already in the database)\n\n");
        else{
           /*The same codes here*/
        }
    }
}

Я думаю, что проблема сейчас заключается в том, что он возвращает root, когда обнаруживает «недопустимый ввод».Я вызываю add () с помощью root = add (root), поэтому, если он столкнулся с проблемой, он указывает на ноль или что-то еще.Итак, что, по вашему мнению, я должен делать?

EDIT [LAST]: Проблема действительно заключается в том, что add () возвращает, если обнаруживается «неверный ввод».Я изменил BST * add на void add, чтобы избежать root = add (root), затем сделал необходимые изменения в функции, и теперь она работает.Спасибо за ваши ответы, но я не могу поставить галочку, так как думаю, что никто не ответил правильно.Теперь я делаю это с помощью функции fgets ().

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Давайте начнем с: что возвращается из checknum(), если ему нужно откатиться назад, сверяясь с дочерью?

Или, что эквивалентно, вы скомпилировали с -Wall или эквивалентом вашего компилятора активации всехпредупреждения?Какие предупреждения были там?

0 голосов
/ 22 июня 2011

Вам не хватает return в конце вашей checknum() функции:

  int i = root->employee.emnumber <= num;
  return checknum(root->child[i], num);        //Added a return here
}

Без return рекурсивный вызов checknum() не имеет никакого эффекта, и конечное возвращаемое значение, вероятно, не будет тем, что вы хотите. Ваш компилятор должен был предупредить вас об этом, предполагая, что у вас включены предупреждения (обычно что-то вроде "не все пути возвращают значение").

...