能否让fgets()只接受字母?

3
在这个数据库中,我需要有一些限制,比如名称只能是字母等等。
但是如果我使用scanf("%s, c.name) ,它只读取第一个空格之前的内容,所以如果我要添加像Marie Claire这样的两个名字,我不能使用scanf。
我有一种方法可以检查字符串是否包含数字(将提供它),但我想知道是否可以使fgets()仅接受字母。我也会提供我尝试过的代码,但当我使用这种方法时,它不接受任何输入,只是跳过。
printf ("\nPlease enter Name:\n");
    while (fgets (c.name, sizeof (c.name), stdin)  && cCheck(c.name,100) == FALSE);
    {

    }

检查数字的方法[使用我自己定义的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;
}

当你解决自己的问题时,最好先给出一个答案,然后将其标记为已接受。 - effeffe
不要写blah == FALSE; 写! blah更清晰、更安全。 - Keith Thompson
5个回答

4

就像下面的代码示例一样,您可以指定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

INFO:scanf()格式规范和语法


缓冲区长度必须比你在 scanf 中指定的字段宽度多至少一个字符,以容纳0终止符。 - Daniel Fischer

1
但是如果我使用scanf("%s, c.name)来读取,它只会读取到第一个空格,所以如果我要添加像Marie Claire这样的两个名字,我不能使用scanf。

你可以这样写:

scanf( "%s %s", c.name, c.surname ); // better with s_scanf

我有一个方法可以检查字符串是否包含数字(将提供它),但我想知道是否可以使fgets()仅接受字母。
不,fgets()读取字符直到包括\n,你无法改变这一点。相反,利用这一点,将字符读入缓冲区并提取名称,例如使用sscanf()甚至strtok()。
再次建议使用_s版本的函数以避免不愉快的意外。

0

你尝试过从字符串中删除'\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);

0

我是如何修复它的:

// ----- 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,然后进行了strcpy :)


0
简而言之,不行。但通常最好将输入和检查分开 - 因此使用 fgets 读取文本,然后使用 isalpha 或类似的函数进行检查。

没问题,我找到了解决办法 :) - DodoSombrero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接