#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; }
так сложно ни для чего, просто используйте if2. Обратите внимание, что
"%[^n]s"
это гибрид: обычно вам понадобится"%[^n]"
или"%s"
.3. И никогда не вызывайте
main
из своей собственной программы. Хотя это явно не запрещено в C, это все равно плохо. Вместо этого используйте циклы.4. Это
s
не часть%[]
формата. Это заставляетscanf
искать и пытаться сопоставить явноеs
значение во входных данных. Начальный пробел должен пропускать начальный пробел из входных данных, например, новые строки, оставленные во входном буфере из предыдущих входных данных.5. @bruno Спасибо. Я собираюсь прочитать больше о глобальных переменных и где их использовать.
Ответ №1:
это должно быть "%[^n]%*c"