簡體   English   中英

我可以讓fgets()只接受字母嗎?

[英]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

有關詳細信息,請參閱以下鏈接:

的fscanf

信息:scanf()格式規范和語法

但是如果我使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM