Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我可以让fgets()只接受字母吗?_C_String_Validation_Fgets - Fatal编程技术网

C 我可以让fgets()只接受字母吗?

C 我可以让fgets()只接受字母吗?,c,string,validation,fgets,C,String,Validation,Fgets,因此,在这个数据库中,我需要有一些限制,比如只有名字和字母等等 但是如果我使用scanf(“%s,c.name”)作为示例,它只读取到第一个空格,所以如果 我必须加上两个名字,比如玛丽·克莱尔,我不能用scanf 我有一个方法可以检查字符串是否包含数字(将提供它),但我想知道是否可以让fgets()只接受字母。我也会提供我尝试过的方法,但当我使用此方法时,它不接受任何输入,只是跳过它 printf ("\nPlease enter Name:\n"); while (fgets (c.n

因此,在这个数据库中,我需要有一些限制,比如只有名字和字母等等

但是如果我使用scanf(“%s,c.name”)作为示例,它只读取到第一个空格,所以如果 我必须加上两个名字,比如玛丽·克莱尔,我不能用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;
}
booleanCheck(字符*测试,int max)
{
int x;

对于(x=0;x,简而言之,不是。但是将输入和检查分开几乎总是更好的-因此使用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);
#包括
#包括
字符buf[大小];
int-good;
做{
尺寸i;
char*pend;
良好=1;
fgets(buf、buf尺寸、标准尺寸);
pend=strchr(buf,'\n');
if(pend!=NULL)
*pend='\0';
其他的
冲洗(标准尺寸);
对于(i=0;buf[i]!='\0'&&good;i++)
if(!isdigit(buf[i])
良好=0;
}而(好!=1);
但是如果我使用scanf(“%s,c.name”)作为示例,它只能读取到 在第一个空格中,如果我必须加上两个像玛丽·克莱尔这样的名字,我 无法使用scanf

你可以写

scanf( "%s %s", c.name, c.surname ); // better with s_scanf
我有一个方法,可以检查字符串是否包含数字 没有(将提供),但我想知道是否可以制作fgets() 只接受信件

不,
fgets
可以读取小于等于
\n
的字符,对此您无能为力。相反,您可以通过将字符读入缓冲区并提取名称(例如使用
sscanf()
甚至
strtok()


再次建议使用_s版本的函数以避免令人不快的意外情况。

与下面的代码示例类似,您可以将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;
}
有关详细信息,请参阅以下链接:

我是如何修复的:

// ----- 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);
我添加了一个新的
字符名称检查[50];

对它执行了
fgets()


名称检查
时做了
,然后做了
strcpy
:)

没问题,我找到了一个方法:)当你解决自己的问题时,最好先给出一个答案,然后将其标记为已接受。不要写
blah==FALSE
;写
更清晰、更安全!blah
对于0-终止符,缓冲区必须至少比你给
scanf
的字段宽度长一个
char
// ----- 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);