【问题标题】:How to check if particular characters appeared in same order?如何检查特定字符是否以相同的顺序出现?
【发布时间】:2016-01-25 21:02:35
【问题描述】:

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

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

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

【问题讨论】:

  • -,=,:每个字符只有一个吗?
  • 如果一个字符串多次出现分隔符-=:,则该帖子不清楚所需的功能。如果具有多个分隔符的功能很重要,请提供详细信息。

标签: c string parsing


【解决方案1】:

只需要一点编程。

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

【讨论】:

  • 非常漂亮和赞成。不过,我想我会写if (((p = strchr(s, '-'))) && ((p = strchr(p, '='))) && strchr(p, ':'))
  • @rici 同意strchr() - 认为too
【解决方案2】:

strchr()打3个电话怎么样?

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

【讨论】:

  • 这是一种错误的方法,因为条件 (t = strchr(s, '-')) 不能保证在 '-' 之前没有例如 '='。
  • 来自莫斯科的@Vlad 也许:OP 的措辞可以采取多种方式,不幸的是this hour old comment 没有提供更多信息。 ":PO-ELK=SAEER:SWE" 可能是有效的,因为“- 必须始终在 = 之前,并且应该始终在 a 之前:” OTOH 它失败,“- 必须始终在 = 之前,并且应该总是在 all :"之前。这是一种微妙的英语,还没有被 OP 清楚地表达出来。
【解决方案3】:

有点有趣的问题,它可能对 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?

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 这是一道 C 题。
    • 哦 :) 我在问题中看到“字符串”,我已经切换到 c++ ;)
    【解决方案5】:

    您可以使用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");
        }
    }
    

    【讨论】:

      【解决方案6】:

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

      #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;
      } 
      

      【讨论】:

        【解决方案7】:

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

        #include <stdio.h>
        #include <string.h>
        
        int main( void )
        {    
            const char *s = "PO-ELK=SAEER:SWE";
            const char *t = "-=:";
            size_t n = 0;
        
            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] )
            {
                printf( "\"%s\" is a valid string\n", s );
            }
            else
            {
                printf( "\"%s\" is not a valid string\n", s );
            }
        
            s = "PO-ELK:SAEER=SWE";
            n = 0;
        
            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] )
            {
                printf( "\"%s\" is a valid string\n", s );
            }
            else
            {
                printf( "\"%s\" is not a valid string\n", s );
            }
        
            return 0;
        }            
        

        程序输出

        "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' )
        

        【讨论】:

          猜你喜欢
          • 2019-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-23
          • 2014-12-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多