scanf(«%[^ n] s», полное имя); убивает мою программу

#c #scanf

#c #scanf

Вопрос:

Я новичок, и мне нужна помощь со scanf. Я разрабатываю банковское приложение на C, и каждый раз, когда я пытаюсь прочитать полное имя с пробелами в stdin, моя программа просто убивает себя без предварительного предупреждения, и gcc не выдает мне никаких ошибок при компиляции.

Если быть точным, это происходит, когда я пытаюсь использовать это: scanf("%[^n]s", fullName); вместо этого scanf("%s", fullName);

Моя проблема — пробел.

 // Libraries
#include <stdio.h>
#include <stdlib.h>

// Declaration of methods
void header(void);
void menu(void);
int manage(void);
void createAcc(void);

// Declaration of vars
int menuOption;
int manageOption;

// Main method
int main(void)
{
    // Clear console
    //system("clear");
    // Calls header and menu (just text), asks for an option at menu an assign it to menuOption var.
    header();
    menu();
    scanf("%d", amp;menuOption);

    // Check the option choose and run code
    switch (menuOption)
    {
    case 1:
        manage();
        break;
    
    default:
        break;
    }
    return 0;
}

// Header method
void header(void)
{
    printf("nttttC Bankn");
    printf("tttChoose your option.n");
}

// Menu method
void menu(void)
{
    printf("nttt[1] Manage accounts.n");
}

// Manage account method
int manage(void)
{
    // Create
    // Read
    // Update
    // Delete
    //system("clear");
    header();
    printf("n");
    printf("ttt[1] Create account.n");
    printf("ttt[2] Update account.n");
    printf("ttt[3] Delete account.n");
    printf("ttt[4] List all accounts.n");
    printf("ttt[5] Return to main menu.n");
    scanf("%d", amp;manageOption);

    switch (manageOption)
    {
    case 1:
        createAcc();
        break;
    case 5:
        main();
        break;    
    default:
        break;
    }
    return 0;
}

void createAcc(void)
{
    // Aux vars
    char *fullName = malloc(sizeof(char) * 255);
    char *email = malloc(sizeof(char) * 255);
    char *address = malloc(sizeof(char) * 255);
    int key;
    //system("clear");
    header();
    printf("n");
    printf("ttt[1] Create account.n");
    printf("nnn");
    printf("What's your full name?n");
    scanf("%[^n]s", fullName);
    printf("%s", fullName);
}
  

Комментарии:

1. из этого sizeof(char) значения 1 по определению бесполезно умножать на него. Почему menuOption и manageOption являются глобальными переменными? switch (menuOption) { case 1: manage(); break; default: break; } так сложно ни для чего, просто используйте if

2. Обратите внимание, что "%[^n]s" это гибрид: обычно вам понадобится "%[^n]" или "%s" .

3. И никогда не вызывайте main из своей собственной программы. Хотя это явно не запрещено в C, это все равно плохо. Вместо этого используйте циклы.

4. Это s не часть %[] формата. Это заставляет scanf искать и пытаться сопоставить явное s значение во входных данных. Начальный пробел должен пропускать начальный пробел из входных данных, например, новые строки, оставленные во входном буфере из предыдущих входных данных.

5. @bruno Спасибо. Я собираюсь прочитать больше о глобальных переменных и где их использовать.

Ответ №1:

это должно быть "%[^n]%*c"