计算C中字符串中char的出现次数

Mik*_*ike 32 c string char

我有字符串 str

char *str = "100.10b.100.100";
Run Code Online (Sandbox Code Playgroud)

我想计算'.'in 的出现次数str,最好是单行.(如果可能没有循环)

我的方法是标准strchr:

  int i = 0;
  char *pch=strchr(str,'.');
  while (pch!=NULL) {
    i++;
    pch=strchr(pch+1,'.');
  }
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 75

这是我做的方式(需要的变量数量最少):

for (i=0; s[i]; s[i]=='.' ? i++ : *s++);
Run Code Online (Sandbox Code Playgroud)

  • 我会称之为*聪明*.在代码中,*聪明*并不总是一件好事.我通常喜欢*明显*. (19认同)
  • 一个聪明的解决方案,但这会将指针移动到另一个位置,因此您将无法再次使用该字符串 (6认同)
  • 不,我正在递增`s`或`i`取决于`s [i]`是否是''.'`或不.表达式`s + i`在每次迭代时总是增加1,但它可能是计数器(`i`)或导致`s + i`增加的基指针(`s`). (2认同)
  • 如果你已经增加了s,为什么不完全用i来计算'.'的出现次数?for(;*s; i + =*s =='.',s ++) (2认同)
  • @cp.engr:在这种情况下,也许我们应该将其设为 `(s[i] != '\0') != 0` 以增加清晰度?;-) (2认同)
  • 我想知道有多少像我这样的人花了一整天的时间试图解决这个问题. (2认同)
  • 如果这个答案包括 `i` 和 `s` 的实例化,它会更有帮助。 (2认同)

tva*_*son 23

看,妈,没有循环.

int c = countChars( s, '.' );

int countChars( char* s, char c )
{
    return *s == '\0'
              ? 0
              : countChars( s + 1, c ) + (*s == c);
}
Run Code Online (Sandbox Code Playgroud)

但是,我实际上使用了一个循环,因为这是正确的控制结构.

  • 但你*是*使用循环!(您只是不使用for/while关键字). (4认同)
  • 我认为`|`应该是`:`。另外,“无循环”很好,但它并不像循环那样具有可读性和可维护性,而且也不会更快。(尽管由于尾递归,它可能不会变慢。)聪明的代码并不总是好代码,尤其是当它混淆了含义时。 (2认同)

Mic*_*l J 22

好的,非循环实现(是的,它意味着一个笑话).

size_t CountChars(const char *s, char c)
{
  size_t nCount=0;
  if (s[0])
  {
    nCount += ( s[0]==c);
    if (s[1])
    {
      nCount += ( s[1]==c);
      if (s[2])
      {
        nCount += ( s[2]==c);
        if (s[3])
        {
          nCount += ( s[3]==c);
          if (s[4])
          {
            nCount += ( s[4]==c);
            if (s[5])
            {
              nCount += ( s[5]==c);
              if (s[6])
              {
                nCount += ( s[6]==c);
                if (s[7])
                {
                  nCount += ( s[7]==c);
                  if (s[8])
                  {
                    nCount += ( s[8]==c);
                    if (s[9])
                    {
                      nCount += ( s[9]==c);
                      if (s[10])
                      {
                        /* too long */
                        assert(0);
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return nCount;
}
Run Code Online (Sandbox Code Playgroud)

  • 我想你在这里加倍了你的8:`nCount + =(s [88] == c);`.您应该编写一个C代码生成器,通过`system`调用`cc`来生成最终结果.或者甚至更好,一个递归代码生成器,以避免代码生成器中的循环. (4认同)
  • 七年后,有人对此投了反对票,甚至没有评论为什么。这是一段可笑的代码,并在顶部这么说。它说明了这个问题的不切实际。有人担心它的风格不好??? (3认同)

Fab*_*sen 11

没有循环会很难,因为没有标准的C库函数可以做到这一点,你需要查看所有字符:)

我会采取明显的解决方案:

int i, count;
for (i=0, count=0; str[i]; i++)
  count += (str[i] == '.');
Run Code Online (Sandbox Code Playgroud)

如果你有必要,请随意将两行实际代码压缩成一行:)

  • 不过,这会修改s。我尝试不去理会原始值:)除此之外,太好了! (2认同)

cdh*_*wie 5

我仍然把它放在一个函数中,参数化源字符串和要搜索的字符.

int count_characters(const char *str, char character)
{
    const char *p = str;
    int count = 0;

    do {
        if (*p == character)
            count++;
    } while (*(p++));

    return count;
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*sop 5

如果您热衷于单线(好吧,两线):

size_t count = 0;
while(*str) if (*str++ == '.') ++count;
Run Code Online (Sandbox Code Playgroud)