C 我可以让fgets()只接受字母吗?
因此,在这个数据库中,我需要有一些限制,比如只有名字和字母等等 但是如果我使用scanf(“%s,c.name”)作为示例,它只读取到第一个空格,所以如果 我必须加上两个名字,比如玛丽·克莱尔,我不能用scanf 我有一个方法可以检查字符串是否包含数字(将提供它),但我想知道是否可以让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
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);