3

所以在这个数据库中我需要有一些限制,比如名称只有字母等等。

但是如果我使用 scanf("%s, c.name) 例如,它只会读取到第一个空格,所以如果我必须添加 2 个名字,比如 Marie Claire,我不能使用 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;
}
4

5 回答 5

4

像下面的代码示例一样,您可以指定 fscanf 来只读字符,如果您指定格式说明符来读取可接受的字符,还可以指定一个.and ' '(空格)。如果你^在前面加上一个 like [^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() 格式规范和语法

于 2012-12-23T19:30:37.877 回答
1

但是如果我使用 scanf("%s, c.name) 例如,它只会读取到第一个空格,所以如果我必须添加 2 个名字,比如 Marie Claire,我不能使用 scanf。

你可以写

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

我有一个方法可以检查字符串是否包含数字(将提供它),但我想知道是否可以让 fgets() 只接受字母。

不,fgets读取字符直到并包括\n您无能为力。而是通过将字符读入缓冲区并提取名称来利用它,例如 withsscanf()甚至strtok()

再次推荐使用 _s 版本的函数以避免令人讨厌的意外。

于 2012-12-23T18:20:37.907 回答
0

简而言之,没有。但是将输入和检查分开几乎总是更好 - 所以使用 fgets 来阅读文本,然后用isalpha或类似的东西检查它。

于 2012-12-23T18:01:31.873 回答
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);
于 2012-12-23T18:02:47.607 回答
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:)

于 2012-12-24T12:25:30.727 回答