1

stdin上の文字と自分の仕様の文字を比較できるようにしたいと思います。これの目的は、コマンドとして指定された単一の文字のみを維持しながら、他のすべての入力を間違っているものとして除外することです。「nn」や「qddaw」のように->間違ってもう一度行きますが、「n」は何か便利なものになります。stdin

これが私が「コード的に」心に留めていることです:

if (input does not contain 'c' or 's' or 'q' or 'n') { 
    printf("some kind of error");
}

さて、私は次のような指定された文字で配列を作成しようとしたarray[] = {'a', 'b', 'c'}ので、関数strncmpを使用してstdinの文字列と比較することができました。

char c[256];
scanf("%s", c)
if (strncmp(array, c, 1) != 0) printf("error");

しかし、それは機能していないようです。助言がありますか?

編集1:これが実際のコードです:

char c[256];
char* s = "nsrld";
char* quiter = "q";

do 
    {
        printf(">");
        scanf("%s", c);
        if (only when there is no 'n' or 's' or other char from char* s on input)
        {
            errorHandle(ERROR_WRONG_CMD);
        }
        scanf("%*[^\n]"); scanf("%*c");
    } while (strcmp(c,quiter) != 0);

ご覧のとおり、私は「q」をうまく処理しましたが、複数の文字はお尻の痛みです。アドバイスありがとうございます。

編集2:つまり、入力を指定された文字のセットと比較し、1つまたは別の文字が存在する場合にのみ関数が渡される関数が必要です(ただし、文字が一緒にある場合は通過しません)。 'qs'のように)

4

8 に答える 8

1
char c = getchar();
switch (c) {
case 'c':
case 's':
case 'q':
case 'n':
  do_something();
  break;
default:
  print_error();
};

上記のコードは機能するはずです。ifステートメントが機能しなかった理由がわかりません。一般に、スイッチはこのタイプのシナリオでもうまく機能します。

于 2012-04-14T22:54:06.383 に答える
1
int ch = getchar();
if (ch != EOF)
{
    if (strchr("csqn", ch) == NULL)
    {
        printf("Evil Bad Character <%c> in Hex %02X\n", ch, ch);
    }
    else
    {
        /* Do stuff with ch */
    }
}
else
{
    printf("EOF on input\n");
}
于 2012-04-14T23:46:12.337 に答える
1

私は自分自身を十分に明確にしませんでした。私が必要としているのは、「wwqwqe」のように「何でも入力してください」と入力し、入力が「c」または「s」(およびその他)でない限り、エラーを実行することです。

char usersInput[200] = "";            /* A buffer to hold the input values */
char *result = gets(usersInput);      /* Fill the buffer from stdin */
if (result != NULL)                   /* If we got something */
{
    if (strlen(usersInput) == 1)      /* the input must be exactly 1 character */
    {
        char ch = usersInput[0];
        if (strchr(ch, "csqn") == NULL)    /* It must be a valid values */
        {
            printf("Evil Bad Character <%c>\n", ch);
        }
        else
        {
            /* Do stuff with the known valid input value ch */
        }
    }
    else
    {
        puts("The input value must be exactly 1 character\n");
        puts("and must be 'c', 's', 'q' or 'n'");
    }
}
else
{
    puts("EOF or ERROR while reading stdin\n");
}

これでうまくいくはずです。

1つの警告。 getは、 usersInputが200文字の長さであることを知るのに十分なほど賢くはありません

201文字以上を入力すると、メモリ内の他の文字が上書きされます。そのようなことは、見つけにくいバグにつながる可能性があります。

于 2012-04-15T13:04:35.873 に答える
0

解決策があるように見えますが、要求しているものが、標準の「getopt」機能からそれほど遠くないように聞こえないことは言及する価値があるかもしれません... http://を参照してください。たとえば、www.gnu.org / software / libc / manual / html_node/Getopt.html 。

于 2012-04-15T12:59:04.483 に答える
0

関数を書く

int IsGood(int c)
{
    if(c=='a'||c=='b'||c=='c')
    return 1;
    else
    return 0;
}
于 2012-04-14T22:55:54.807 に答える
0

最初のソリューションが機能するはずです。それがあなたが投稿したのとまったく同じコードである場合、問題は、printfがコンソールにフラッシュするために最後に改行を必要とするためである可能性があります。

于 2012-04-14T22:58:05.977 に答える
0

私は文字列をセットと考えていました...したがって、それらの共通部分がvoidセットである場合、失敗します-> printf( "Error")...それ以外の場合、出力はnoneです。

#include <stdio.h>
#include <string.h>

int intersection(char* source, char* search)
{
  int i,j;
  for(i = 0; i < strlen(search); i++)
    if(strchr(source,search[i]))j++;
  if(j != strlen(search))return 0;
  else return 1;
}

int main()
{
  char *letters = "eo";
  char *p = "hello";
  int e = intersection(p,letters);
  if(e==1)puts("Non Void");  
  else puts("Void");
}
于 2012-04-14T23:50:22.263 に答える
0

これは私のために働いた:

    char c[256];
    char* s = "nqsrld";
    char* quiter = "q";

    do 
    {
        printf(">");
        scanf("%s", c);
        if ((strpbrk(s, c) == 0) || (strlen(c) >= 2))
        {
            errorHandle(ERROR_WRONG_CMD);
        }
        scanf("%*[^\n]"); scanf("%*c");
    } while (strcmp(c,quiter) != 0);

みんなの助けに感謝します。

于 2012-04-15T12:44:50.323 に答える