如何检查特定字符是否以相同的顺序出现?

时间:2016-01-25 21:02:36

标签: c string parsing

例如,我有一个字符串:PO-ELK=SAEER:SWE

-必须始终在=之前,且应始终在:之前。

有没有一种简单的方法可以查看我输入的字符串中是否满足这些条件,如果没有,则返回错误。

7 个答案:

答案 0 :(得分:2)

只需要一点点编程。

const char *symbol = "-=:";
const char *s = "PO-ELK=SAEER:SWE";
while (*s) {
  if (*s == *symbol) symbol++;
  s++;
}
if (*symbol) puts("Fail");
else puts("Success");

答案 1 :(得分:1)

排序有趣的问题,它可能对 code-golf

有好处
$ cat > yesno.c
#include <stdio.h>
#include <strings.h>

int main(int ac, char **av) {
  char *s = "-=:",
      *s0 = s,
       *i = av[1];

  while(*s && i && *i) {
    if(index(s0, *i)) {
      if(*i == *s) {
        ++i;
        ++s;
        continue;
      } else
        break;
    }
    ++i;
  }
  printf("%s\n", *s ? "no" : "yes");
}

^D
$ cc -Wall yesno.c
$ ./a.out PO-ELK=SAEER:SWE

规格中有一些灰色区域。角色是否重复?如果是这样,我们是否按顺序搜索 的子序列?我们是否要求找到所有三个?程序是否需要是交互式的,还是只能使用shell args?

答案 2 :(得分:1)

3次拨打strchr()怎么样?

const char *s = "PO-ELK=SAEER:SWE";
const char *t;
if ((t = strchr(s, '-')) && (t = strchr(t, '=')) && (t = strchr(t, ':'))) puts("Success");
else puts("Failure");

答案 3 :(得分:0)

使用std::string::find。利用第二个参数。

首先查找“ - ”,如果可以找到,请搜索“=”作为起点的“ - ”位置。然后对“:”执行相同操作,并将位置“=”作为第二个参数。

答案 4 :(得分:0)

您可以使用strchr函数,该函数返回指向字符串中字符的指针。因此,您可以为每个有问题的字符调用此函数,并检查索引的顺序是否正确。

const char *str = "PO-ELK=SAEER:SWE";
const char *dashPtr = strchr(str,'-');
const char *equalPtr = strchr(str,'=');
const char *colonPtr = strchr(str,':');

if ((dashIdx  == NULL) || (equalIdx == NULL) || (colonIdx == NULL)) {
    printf("one of -, =, : not found\n");
} else {
    if ((dashPtr < equalPtr) && (equalPtr < colonPtr)) {
        printf("order correct\n");
    } else {
        printf("order incorrect\n");
    }
}

答案 5 :(得分:0)

在这类问题中使用状态机: 这是我的解决方案,我没有测试它,但它应该给你一些想法

#include <string.h>
#include <stdio.h>
typedef enum {init, s1,s2,s3,end}eState;
int main()
{
 char str[20] ="PO-ELK=SAEER:SWE";
 int iExit = 0;
 int i =0;
 char c;
 eState state = init;

 while (!iExit)
 {
  c=str[i];
  switch (state)
  {
      case init:
        if (c =='-')
            state = s1;
        else if ((c =='=')||(c ==':'))
            state = end;
        break;
      case s1:
        if (c =='=')
            state = s2;
        else if(c ==':'||c=='-')
            state = end;
        break;
      case s2:
        if (c ==':')
            state = s3;
        else if(c =='='||c=='-')
            state = end;
        break;
      case s3:
        printf ("Succes \n");
        iExit = 1;
        break;
      case end:
        printf ("Error \n"),
        iExit = 1;
        break;
      default :
        break;
   }

  i++;
}

return 0;
} 

答案 6 :(得分:0)

您可以使用此演示程序中显示的想法。这种方法的优点是你只需编写一个if语句来检查一个字符串。

"PO-ELK=SAEER:SWE" is a valid string
"PO-ELK:SAEER=SWE" is not a valid string

程序输出

if ( s[n = strcspn( s + n, t )] == t[0] &&
     s[n += 1 + strcspn( s + n + 1, t )] == t[1] &&
     s[n += 1 + strcspn( s + n + 1, t )] == t[2] &&
     s[n += 1 + strcspn( s + n + 1, t )] == '\0' )

为了保证字符串不包含多个目标字符,您可以按以下方式编写条件

hazelcast-spring