2012-04-14 59 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”的东西不错,但多个字符都在屁股痛。感谢您的任何建议。

编辑2:或者换句话说我需要一个函数,其将比较与一组给定的字符的输入且仅当有一个OR另一个(如“Q”或“S”的功能将通过(但如果有字符在一起,就像“QS”)

+0

使用getchar(),您是否尝试打印'c'?打印出来就像这样:printf(“c =%c /%d \ n”,c,c);另外,'c','char'或'int'的类型是什么? – 2012-04-14 22:55:13

+0

@GeorgeSkoptsov我编辑的帖子,因为我实际上需要区分输入“qdqqdq”和“q”,在这种情况下,只有独立的“q”才能完成这项工作,而其他任何输入都会报告错误。 – Markus 2012-04-15 11:57:45

回答

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

这应该做的工作。

一个警告。 得到是不够聪明,知道用户输入是200个字符长。

它会高兴地让你输入201个字符或更多,它会覆盖内存中的其他字符。这种事情会导致难以发现的错误。

+0

嗯,如果我想要我的例子[链接](http://stackoverflow.com/a/10162127/1333847)无限循环和我想在返回两次“回车”后返回错误。我该怎么办?在我的版本中,我可以根据需要多次进入,没有任何反应,它仍在等待另一个输入。 – Markus 2012-04-15 13:24:51

+0

多数民众赞成在一个新的问题。 – EvilTeach 2012-04-15 14:05:10

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

上面的代码应该工作。我不知道为什么你的if语句不能正常工作,一般开关在这种情形下效果很好

+0

这里的问题与getchar因为它只需要一个字符,所以像“cawwffawf”这样的输入将通过这个测试。我需要的是当输入像“caawfaw”printf错误,但是当输入正好是一个字符“c”时,做一些有用的事情。 – Markus 2012-04-15 08:12:50

0

撰写功能

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

我编辑了第一篇文章以反映我的需求。我需要能够将输入“cwdwdaf”与'c'区分开来,在这种情况下,只有'c'会使某些有用的东西有用。其他输入将解析错误。 – Markus 2012-04-15 08:43:25

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 2012-04-15 08:43:05

+0

你的问题和例子有误导性。 getchar一次获取一个字符。如果你想处理检查所有的输入,然后执行一些操作,你需要修改你的问题。 – EvilTeach 2012-04-15 12:44:30

+0

耶对不起,我已经想通了,谢谢你的时间和精力,我真的很感激! :) – Markus 2012-04-15 12:57:09

0

我已经想好了字符串作为套......所以,如果它们的交集是无效设置,那么我们就会失败 - >的printf(“错误”)......否则输出为无...

#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”,并做了错误,除非输入仅仅是“C”或只是“S”(和几个)。用你的代码,如果我将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]”);的scanf( “%* C”); (strcmp(c,quiter)!= 0);' – Markus 2012-04-15 08:24:30

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

感谢大家的帮助。