Могу ли я заставить 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 3

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

Смотрите следующие ссылки для получения более подробной информации:

Fscanf

Информация: спецификации формата scanf() и синтаксис

Но если я использую 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 , а затем сделал a strcpy :)