2012-04-14 15 views
1

Я хотел был бы иметь возможность сравнить символ на stdin с характерами моей спецификации. Цель этого состоит в том, чтобы отфильтровать каждый другой вход как ошибочный, сохраняя только указанные отдельные символы как команды. Как на stdin «nn» или «qddaw» -> неправильно, но «n» сделать что-то полезное.Как сравнить символ с множеством заданных символов в C?

Вот что я имею в виду «код-накрест»:

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

Ну я попытался создать массив с заданными символами, как array[] = {'a', 'b', 'c'}, так что я мог бы быть в состоянии сравнить его с строку на stdin с функцией strncmp .. как

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

но он не работает. Какие-либо предложения?

Edit1: Вот фактический кусок кода:

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» вещь довольно хорошо, но несколько символов являются боль в заднице. Спасибо за любой совет.

Edit 2: или другими словами, мне нужна функция, которая будет сравнивать вход с набором заданных символов и только тогда, когда есть один ИЛИ другой (например, «Q» или «S» функция будет проходить (но если есть символы вместе, как «QS»)

+0

С помощью getchar() вы пытались распечатать 'c'? Распечатайте его следующим образом: printf ("c =% c /% d \ n", c, c); Кроме того, каков тип 'c',' char' или 'int'? –

+0

@GeorgeSkoptsov Я отредактировал сообщение, потому что мне действительно нужно отличить ввод «qdqqdq» от «q», и в этом случае только отдельная «q» выполнит эту работу, и любой другой ввод сообщит об ошибке. – Markus

ответ

1

Я недостаточно прояснился. Мне нужно вводить «тип, что угодно», например «wwqwqe», и делать ошибку, если только вход «просто» или «просто» (и еще несколько).

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"); 
} 

Это должно выполнить эту работу.

Предупреждение. получает не достаточно умен, чтобы знать, что usersInput имеет длину 200 символов.

Он с радостью позволит вам ввести 201 символа или более, что перезаписывает другие символы в памяти. Такие вещи могут привести к труднодоступным ошибкам.

+0

hmm и если я хочу иметь бесконечный цикл, как на моем примере [link] (http://stackoverflow.com/a/10162127/1333847) и Я хочу вернуть ошибку, дважды нажав «ввести». Что мне делать? в моей версии я могу входить столько раз, сколько хочу, и ничего не происходит, он все еще ждет другого ввода. – Markus

+0

вот новый вопрос. – EvilTeach

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

Приведенный выше код должен работать. Я не знаю, почему ваш, если заявление не работает. как правило, переключатель хорошо работает в этом типе сценария

+0

проблема здесь с getchar так как для этого теста требуется только один символ, который вводится как «cawwffawf». Мне нужно, когда ввод похож на «caawfaw» printf error, но когда ввод - это точно один символ «c», сделайте что-нибудь полезное. – Markus

0

int IsGood(int c) 
{ 
    if(c=='a'||c=='b'||c=='c') 
    return 1; 
    else 
    return 0; 
} 
+0

Я отредактировал первое сообщение, чтобы отразить мои потребности. Мне нужно уметь отличать ввод «cwdwdaf» от «c», и в этом случае только «c» сделает что-то полезное, любой другой вход обработает ошибку. – Markus

0

Ваше первое решение должно работать. Если это тот же самый код, который вы отправили, - тогда ваша проблема может, потому что printf нуждается в новой строке в конце, чтобы скрыться до консоли.

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"); 
} 
+0

Я отредактировал первое сообщение, чтобы отразить мои потребности. Мне нужно уметь отличать ввод «cwdwdaf» от «c», и в этом случае только «c» сделает что-то полезное, любой другой вход обработает ошибку. – Markus

+0

Ваш вопрос и примеры вводят в заблуждение. getchar получает по одному персонажу за раз. Если вы хотите иметь дело с проверкой всех входных данных, то, выполняя некоторые действия, вам нужно переработать свой вопрос. – EvilTeach

+0

Да, извините за путаницу, я уже понял это, спасибо за ваше время и усилия, я очень ценю это! :) – Markus

0

Я думал строку как наборы ... Так что, если пересечение них пустота множество, то мы не сможем -> Е («Error») ... в противном случае выход является не ...

#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"); 
} 
+0

благодарю вас за этот код, но, возможно, я не сделал себе достаточно ясно. Мне нужно вводить «тип, что угодно», например «wwqwqe», и делать ошибку, если только вход «просто» или «просто» (и еще несколько). С вашим кодом, если я укажу p как набор «cs», пройдет даже вход, подобный «cs». Код «q» завершает прог. 'char c [256]; char * s = "nsrld"; char * quiter = "q"; do { printf (">"); scanf ("% s", c); if (dunno) { errorHandle (ERROR_WRONG_CMD); } scanf ("% * [^ \ n]"); зсапЕ ("% * C"); } while (strcmp (c, quiter)! = 0); ' – Markus

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); 

Спасибо всем за помощь.

0

Хотя кажется, что у вас есть решение, возможно, стоит упомянуть, что то, о чем вы просите, звучит не так, как будто это далеко от стандартной функции getopt ... См. http://www.gnu.org/software/libc/manual/html_node/Getopt.html например.

Смежные вопросы