Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算字符'/';用C字串?_C_String - Fatal编程技术网

如何计算字符'/';用C字串?

如何计算字符'/';用C字串?,c,string,C,String,如何计算/的C字符串中出现的次数 我可以这样做: int countSlash(char str[]) { int count = 0, k = 0; while (str[k] != '\0') { if (str[k] == '/') count++; k++; } return count; } 但这不是一种优雅的方式;关于如何改进它的任何建议?将形成一个较小的循环: ptr =

如何计算
/
的C字符串中出现的次数

我可以这样做:

int countSlash(char str[])
{
    int count = 0, k = 0;
    while (str[k] != '\0')
    {
          if (str[k] == '/')
              count++;
          k++;
    }
    return count;
}
但这不是一种优雅的方式;关于如何改进它的任何建议?

将形成一个较小的循环:

ptr = str;

while ((ptr = strchr(ptr '/')) != NULL)
    count++, ptr++;

我应该补充一点,我不是为了简洁而支持简洁,我总是选择最清晰的表达方式,在其他条件相同的情况下。我确实觉得
strchr
循环更优雅,但问题中的原始实现很清楚,并且存在于函数中,所以我不喜欢其中一个,只要它们都通过了单元测试。

您的就足够了。也许,这对某些人来说会更漂亮:

int countSlash(char * str)
{
    int count = 0;
    for (; *str != 0; ++str)
    {
        if (*str == '/')
            count++;
    }
    return count;
}
这也将有助于:

int count=0;
char *s=str;
while (*s) count += (*s++ == '/');

通用接口、明显的方法、适当的类型和纯粹的惯用表达:

size_t str_count_char(const char *s, int c)
{
    size_t count = 0;

    while (s && *s)
         if (*s++ == c)
             ++count;

    return count;
}

Oli Charlesworth可能会在同一行中提出关于赋值和条件的问题,但我认为这是相当隐蔽的;-)

在我看来,您的界面已经足够优雅了。主要的批评可能是与
int countChar(char const*str,char c)
相比,它的接口相当专业,它(a)承诺不会修改传递的字符串,并且(b)可以用于计算星号、空格等,基本上不会降低效率。如果您真的想要不那么通用的接口,您可以编写一个简单的函数
int countSlash(char const*str){return countChar(str,“/”);}
。如果启用了内联etc,编译器很有可能会为您优化它。优雅可能有许多不同的方式。它可能是最短的,或最可读的,或最容易理解的。最具可读性的,也可能是其他人最不可读的。因此,“雅”,是一种主观的思想。在速度方面,也许你应该寻求最有效的方法。没错,但在21世纪,没有很好的理由编写这样的代码@也许是这样。我对标准C中的这种单行程序没有问题,但是像这样的循环通常不会出现在我自己的代码中?我是一个20世纪的C代码编写者,仍然在工作;pb2q编写的函数作为
countSlash()
函数的主体在我看来还行。@OliCharlesworth我真的不能说在表达式中赋值有问题,毕竟它是一种语言特性,我很容易阅读和理解。另一方面,我不喜欢“过于冗长”的惯例,我发现当快速浏览几行代码时,代码很难阅读。需要来回跳跃,因为一切都是分散的。不好。:)@奥列夏尔斯沃思:那么你会写什么呢<代码>字符*ptr=strchr(str,“/”);而(ptr!=NULL)ptr=strchr(ptr,“/”)?这会将调用写入
strchr()
两次,这违反了DRY(不要重复)原则。为什么没有空格?为什么是演员?为什么不干脆
n+=(*s++='/')?@JonathanLeffler:是的,这样会更容易看到;)-强制转换:因为str[]是一个数组而不是字符串,这是C@slashmais,我很确定显式转换是完全多余的。我已经很久没有用C做过任何实数编码了,但是,我记得,当你传递一个引用数组的变量时,它会自动降级为指向该数组第一个元素的指针。因此,
char-str[]
char*str
在所有意图和目的下都应该是完全可互换的是有效的C代码。你真的不需要做演员。这里三元运算符的用法是多余的
(*s++='/')
无论如何都将返回
0(false)或
1
(true)。您正在这样做:
(1 | | 0)?1:0`@杰克:谢谢,下面来说明C++(BOOL类型)如何在C中用直接思维来改变我的答案:“我可能错了,但是我认为你的循环不变量可以简化为简单的<代码>(*s)< /C>。只需在执行的最开始检查
s
是否不是
NULL
指针。@GregE:没错,这里最多需要检查一次
NULL
。我坚信编译器比我聪明,因此我依靠编译器来优化它。这应该很容易,因为我们没有在这个函数的任何地方修改
s
。@Philip,可能吧,但考虑到它是多余的,并且使循环成本更高,为什么不将它移到包含
if
语句呢?顺便说一句,我注意到本页上的大多数解决方案都不需要检查
NULL
指针,而是直接跳转到对字符串的解引用,这可能会导致未定义的行为,因此没有做同样的事情是值得称赞的。