[英]Can I make fgets() accept only letters?
所以在這個數據庫中我需要有一些限制,比如Name只有字母等等。
但是如果我使用scanf(例如“%s,c.name”),它只會讀到第一個空格,所以如果我必須添加像Marie Claire這樣的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;
}
與下面的代碼示例一樣,您可以將fscanf指定為只讀字符,也可以指定a .
和' '
(空格)如果指定要讀取的可接受字符的格式說明符。 如果你把^
放在前面就像[^a-zA-Z. ]
[^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
有關詳細信息,請參閱以下鏈接:
但是如果我使用scanf(例如“%s,c.name”),它只會讀到第一個空格,所以如果我必須添加像Marie Claire這樣的2個名字,我就不能使用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()
用nameCheck
做了一段while
然后做了一個strcpy
:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.