【问题标题】:Why can't my function take in a char variable type?为什么我的函数不能接受 char 变量类型?
【发布时间】:2021-05-02 22:47:59
【问题描述】:

代码如下:

#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>

bool isHex(char * str[20]){
    return isxdigit(str);
}

int main(){
    printf("%d\n", isHex("A8"));
    return 0;
}

我在尝试编译时收到以下消息:

ishex.c:6:21: warning: incompatible pointer to integer conversion passing 'char **'
      to parameter of type 'int' [-Wint-conversion]
    return isxdigit(str);
                    ^~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/_ctype.h:280:14: note: 
      passing argument to parameter '_c' here
isxdigit(int _c)
             ^
ishex.c:13:26: warning: incompatible pointer types passing 'char [3]' to parameter
      of type 'char **' [-Wincompatible-pointer-types]
    printf("%d\n", isHex("A8"));
                         ^~~~
ishex.c:5:19: note: passing argument to parameter 'str' here
bool isHex(char * str[20]){

我的代码有什么问题?如果字符串是有效的十六进制字符,我只希望它返回 true (1),如果字符串不是有效的十六进制字符,则返回 false (0)。

【问题讨论】:

  • 用你自己的话来说:你认为char * str[20] 是什么意思——你会用什么词来解释str 的类型是什么?您是否希望"A8" 成为该类型的实例?为什么?
  • char *str[20] 表示 20 个字符串的数组。 "A8" 不是字符串数组,它只是一个字符串。
  • 声明它只是char *strchar str[]。您不需要在参数声明中指定大小(您可以这样做,但会被忽略)。
  • @Barmar const char *const char [] 。 const 正确性应该从一开始就学习

标签: c pointers


【解决方案1】:

很多问题:

  1. char * str[20] 是 20 个指向 char 的指针的数组。实际上是char **
  2. isxdigit 只检查一个字符而不是整个字符串。您需要遍历所有字符。
bool isHex(const char *str)
{
    bool result = str ? true : false;
    if(result)
    {
        while(*str)
            if(!isxdigit((unsigned char)*str++))
            {
                result = false;
                break;
            }
    }
    return result;
}

int main(void){
    printf("%d\n", isHex("A8"));
    return 0;
}

【讨论】:

    【解决方案2】:

    你有两个问题。首先,您定义的函数采用char 指针数组,但您传递的是单个const char*。其次,isxdigit 采用单个 char 而不是 char* 的数组。您应该将功能更改为

    bool isHex(const char *str)
    {
        size_t len;
    
        if ( str == NULL ) { // In general, you need to protect your functions from bad arguments.
            return false;
        }
    
        len = strlen(str);
        for (size_t k=0; k<len; k++) {
            if ( !isxdigit(str[k]) ) {
                return false;
            }
        }
    
        return true;
    }
    

    【讨论】:

    • 1. len 类型错误。 2. 不需要strlen 并再次迭代(strlen 已经这样做了)。 3. 对 isxdigit 的调用不完全正确。
    • 尽量减少返回语句的数量是好的。
    • 我不关注你 3)。
    • 具有大量返回的函数很难阅读,而且很容易犯愚蠢的错误。
    • @DanielWalker "...或表示为unsigned charstr[k],即char,满足第二个标准。" --> 不完全。当str[k] &lt; 0 时,不能表示为unsigned char
    猜你喜欢
    • 1970-01-01
    • 2018-07-24
    • 2020-05-31
    • 1970-01-01
    • 2010-10-09
    • 2011-11-20
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多