c/c++语言开发共享创建strchr()的简化版本

试图创建一个简单的函数,在字符串中查找单个字符“就像strchr()会”,我做了以下内容:

char* findchar(char* str, char c) { char* position = NULL; int i = 0; for(i = 0; str[i]!='';i++) { if(str[i] == c) { position = &str[i]; break; } } return position; } 

到目前为止它的作用。 但是,当我看到strchr()的原型时:

 char *strchr(const char *str, int c); 

第二个参数是int? 我很想知道..为什么不是炭? 这是否意味着我们可以像使用char一样使用int来存储字符?

这让我想到第二个问题,我试图改变我的函数接受一个int作为第二个参数…但我不确定这样做是否正确和安全:

 char* findchar(char* str, int c) { char* position = NULL; int i = 0; for(i = 0; str[i]!='';i++) { if(str[i] == c) //Specifically, is this line correct? Can we test an int against a char? { position = &str[i]; break; } } return position; } 

    考虑fgetc()的返回值, unsigned charEOF范围内的值,一些负值。 这是传递给strchr()的一种值。

    @Roland Illig对导致使用strchr()保留int ch的历史提供了非常好的解释。


    OP的代码失败/有如下问题。

    1) char* str被视为unsigned char *str符合§7.23.1.13

    对于本子条款中的所有函数,每个字符都应解释为具有unsigned char类型

    2) i应该键入size_t ,以处理字符数组的整个范围。

    3)出于strchr()的目的, 空字符被认为是搜索的一部分。

    终止空字符被认为是字符串的一部分。

    4)最好使用const因为str没有改变。

     char* findchar(const char* str, int c) { const char* position = NULL; size_t i = 0; for(i = 0; ;i++) { if((unsigned char) str[i] == c) { position = &str[i]; break; } if (str[i]=='') break; } return (char *) position; } 

    更多细节

    strchr函数定位s指向的字符串中第一次出现的c (转换为char )。 C11dr§7.23.5.22

    所以int c就像char一样对待。 这可能意味着

      if((unsigned char) str[i] == (char) c) { 

    但我认为这意味着:

      if((unsigned char) str[i] == (unsigned char)(char) c) { 

    或简单地说

      if((unsigned char) str[i] == (unsigned char)c) { 

    在ANSI C89之前,声明的函数没有原型。 strchr的声明strchr看起来像这样:

     char *strchr(); 

    而已。 根本没有声明参数。 相反,有这些简单的规则:

    所以,当你打电话给strchr ,真正发生的是:

     strchr(str, (int)chr); 

    引入ANSI C89时,它必须保持向后兼容性。 因此它将strchr的原型定义为:

     char *strchr(const char *str, int chr); 

    这保留了上述示例调用的确切行为,包括转换为int 。 这很重要,因为实现可能会定义传递char参数的工作方式与传递int参数不同,这在8位平台上是有意义的。

      以上就是c/c++开发分享创建strchr()的简化版本相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(计算机技术网)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ctvol.com/c-cdevelopment/549320.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐