Могу ли я заставить fgets () принимать только письма?
Поэтому в этой базе данных мне нужно иметь определенные ограничения, такие как имя только буквы и так далее.
Но если я использую scanf ("%s, c.name) например, он читает только до первого пробела, так что если Мне пришлось добавить 2 имени, как Мари Клэр, я не могу использовать scanf.
У меня есть метод, который проверяет, содержит ли строка цифру или нет (предоставит ее), но мне было интересно, могу ли я заставить fgets() принимать только буквы. Я предоставлю то, что я пробовал, но когда я использовал это метод, он не принимает никаких входных данных, просто пропускает их.
printf ("nPlease enter Name:n");
while (fgets (c.name, sizeof (c.name), stdin) && cCheck(c.name,100) == FALSE);
{
}
Метод проверки на наличие цифр [boolean выполнен с помощью typedef с моей стороны]
boolean cCheck(char *test, int max)
{
int x;
for (x =0; x<max; x++)
{
if (isdigit(test[x]))
{
return FALSE;
}
if (x==max)
{
return TRUE;
}
x++;
}
return TRUE;
}
5 ответов:
Как и в приведенном ниже примере кода, можно указать fscanf для чтения только символов, а также
.
и' '
(пробел), если указать спецификатор формата для чтения допустимых символов. Если вы поместите^
спереди, как[^a-zA-Z. ]
, то он будет читать все, кроме этих символов.#include <stdio.h> int main() { char s[25]; printf("enter a string: "); scanf("%25[a-zA-Z. ]c\n", s); // reads upto 25 chars of a-z/A-Z and '.', ' '. printf("s1: %s\n", s); return 0; }
Пример вывода из приведенного выше кода:
c:\my-src\test-programs>scanf-test.exe enter a string: dasdasd asdasda 34534536 s1: dasdasd asdasda c:\my-src\test-programs>scanf-test.exe enter a string: werfdsfsd3423524525 s1: werfdsfsd
Смотрите следующие ссылки для получения более подробной информации:
Но если я использую scanf ("%s, c.name) например, он читает только до тех пор, пока к первому пробелу, так что если бы мне пришлось добавить 2 имени, таких как Marie Claire, я не может использовать scanf.
Вы можете написать
scanf( "%s %s", c.name, c.surname ); // better with s_scanf
У меня есть метод, который проверяет, содержит ли строка цифру или нет. нет (предоставит его), но мне было интересно, смогу ли я сделать fgets() принимайте только письма.
Нет,
fgets
читает символы до и включая\n
вы ничего не можете сделать об этом. Вместо этого используйте это в своих интересах, читая символы в буфер и извлекая имена, например, с помощьюsscanf()
или дажеstrtok()
Снова рекомендуя использовать _s версии функций, чтобы избежать неприятных сюрпризов.
Короче говоря, нет. Но почти всегда лучше разделить ввод и проверку - поэтому используйте fgets для чтения текста, а затем проверьте его с помощью
isalpha
или чего-то подобного.
Вы пытались удалить
'\n'
из строки?#include <ctype.h> #include <stdio.h> char buf[SIZE]; int good; do { size_t i; char *pend; good = 1; fgets(buf, sizeof buf, stdin); pend = strchr(buf, '\n'); if (pend != NULL) *pend = '\0'; else flush_stdin(); for (i = 0; buf[i] != '\0' && good; i++) if (!isdigit(buf[i]) good = 0; } while (good != 1);
Как я это исправил:
// ----- Name Input ----- // printf ("\nPlease enter Name:\n"); char nameCheck[50]; fgets (nameCheck,sizeof (nameCheck),stdin); while (cCheck(nameCheck,50) == FALSE) { fgets(nameCheck,sizeof (nameCheck),stdin); } strcpy (c.name, nameCheck);
Я добавил новый
char nameCheck[50];
Сделал
fgets()
на немСделал
while
сnameCheck
, а затем сделал astrcpy
:)