【问题标题】:Simplifying multiple equality checks in C [duplicate]简化C中的多个相等检查[重复]
【发布时间】:2019-08-26 21:00:05
【问题描述】:

在 c 中,要搜索字母 a-z,我可以执行以下循环:

char s[10];
int c;
int has_letter = 0;

for (int i=0; (c=s[i])!='\0'; i++) {
    if (c>='a' && c<='z')
        has_letter = 1;
}

但是,什么是字符不是连续的,例如:

// see if any of the following letters are in it: 'adiuo'
char s[10];
int c;
int has_letter = 0;

for (int i=0; (c=s[i])!='\0'; i++) {
    if (c=='a' || c=='d' || c=='i' || c=='u' || c=='o')
        has_letter = 1;
}

有没有办法简化这种结构?例如,执行以下操作:

char s[10];
int c;
int has_letter = 0;

for (int i=0; (c=s[i])!='\0'; i++) {
    if (c in "adiuo") // possible to do something like this?
        has_letter = 1;
}

【问题讨论】:

  • 您发布的代码在进入循环之前未能初始化has_letter,因此除非循环将1 分配给它,否则无法确定它将具有什么值。
  • 您已经提出了一次测试单个字符的问题,但是对于您的示例代码完成的任务,您只需调用一次 strcspn() 即可进行测试一口气所有s的字符。

标签: c


【解决方案1】:

strpbrk() 完全符合我的想法。你像使用它一样

const char mask[] = "adiuo";

if ( strpbrk( str, mask ) ) {
  //do whatever...
} 

该函数返回一个指针,指向出现在字符串mask 中的str 中的第一个字符。如果它不为空,它就在那里。

【讨论】:

    【解决方案2】:

    为此,string.h 提供了一个辅助函数:

    if (strchr("adiuo", c) != NULL)
    

    strchr() 函数返回指向字符串中第一次出现的字符的指针,如果未找到该字符,则返回NULL。所以只要检查它是否返回不是NULL,这意味着在字符串中找到了一个字符。

    【讨论】:

      【解决方案3】:
      char s[10];
      int c, has_letter;
      
      const char* letters = "adiuo";
      
      has_letter = 0;
      for (int i=0; (c=s[i])!='\0'; i++) {
          if (strchr(letters, c) != NULL) {
              has_letter = 1;
              break;
          }
      }
      

      【讨论】:

      • 感谢您指出这一点。我刚刚修好了。
      猜你喜欢
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      相关资源
      最近更新 更多