3

したがって、このデータベースでは、名前のみの文字などの特定の制限が必要です。

しかし、たとえば 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;
}
4

5 に答える 5

4

以下のコード サンプルのように、fscanf を指定して文字のみを読み取ることができます。また、読み取り可能な文字について書式指定子を指定すると、.and ' '(空白) も指定できます。^のように先頭に a を付けると[^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) を使用すると、最初のスペースまでしか読み取れないため、Marie Claire のように 2 つの名前を追加する必要がある場合は、scanf を使用できません。

あなたは書ける

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

文字列に数字が含まれているかどうかを確認する方法がありますが(提供されます)、fgets()に文字のみを受け入れるようにできるかどうか疑問に思っていました。

いいえ、それについてできることは何もありませんfgets\n代わりに、文字をバッファに読み込み、名前を抽出することで、それを有利に使用しますsscanf()strtok()

厄介な驚きを避けるために、関数の _s バージョンの使用を再度推奨します。

于 2012-12-23T18:20:37.907 に答える
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()

で awhileを実行してnameCheckからstrcpy:)を実行しました

于 2012-12-24T12:25:30.727 に答える
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 に答える