获取c中n个元素的字符数组

获取c中n个元素的字符数组,c,C,有没有一种方法可以得到正好由n个元素组成的数组作为函数输入?(我知道我可以使用if语句来检查输入,但我需要一个“实时警告”或“编译错误”。) 比如: void getInt(int number /*This number must be exactly four digits, to be printed on four 7-segments*/){ } void getCh(char *names /*exactly 4 chars*/){ } int main(){

有没有一种方法可以得到正好由n个元素组成的数组作为函数输入?(我知道我可以使用
if
语句来检查输入,但我需要一个“实时警告”或“编译错误”。)

比如:

void getInt(int number /*This number must be exactly four digits, to be printed on four 7-segments*/){

}

void getCh(char *names /*exactly 4 chars*/){
    
}

int main(){
    char boy[5] = "David";
    char girl[4] = "Jane";
    getCh(boy); //I need a compile error here (Or any other run-time warnings)
    getCh(girl); //"Jane" is 4 characters. OK.
    int num = 40, num2 = 12000;
    getInt(num);
    getInt(num2); //I need a warning/compile error here.
    return 0;
}

有什么特色吗?如
s、
指针
s等

男孩和女孩的定义都是错误的,应该是:

char boy[6] = "David";
char girl[5] = "Jane";
我需要一个警告/编译错误

您可以查看信号以构建自己的错误逻辑

Disclamer:For
getCh
此答案要求输入为有效的C样式字符串。我已经要求OP澄清这是否是一个有效的假设。如果OP澄清了这一点,我会更新答案

无法为此获取编译器警告/错误。您所能做的就是实现自己的运行时检查

要生成运行时警告,请执行以下操作:

void getInt(int number)
{
    // Check that input is a 4 digit int
    if (number < 1000 || number > 9999)
    {
        puts("Warning: Illegal call");
        return;
    }

    ....
}

void getCh(char *names)
{
    // Check that input length is 4
    if (strlen(names) != 4)
    {
        puts("Warning: Illegal call");
        return;
    }

    ....    
}
或者更好——把大小的东西留给编译器(这样你就不会弄错了)

编辑

如果您不喜欢使用strlen,可以逐个检查前5个字符。例如:

assert(names[0] != '\0' &&
       names[1] != '\0' &&
       names[2] != '\0' &&
       names[3] != '\0' &&
       names[4] == '\0');

您可以通过以下方式获得其他大小的编译错误:

#define getCh(x) (_Static_assert(sizeof(x) == 4, "Size is not 4"), getCh(x))
请注意,这仅在提供数组作为参数时有效,而不适用于指针


为了增加安全性,可以在编译时使用宏拒绝指针,请参阅。

这两个、
boy
girl
都太小,无法存储您试图初始化它们的内容。因此,我怀疑您将
girl
理解为一个大小为4的数组。这反过来又让我想知道为什么你想要
getCh(girl)
的错误,但显然不是
getCh(boy)
@Yunnosch的错误,谢谢。那是个打字错误。我编辑了它。@Yunnosch No.我有四个7段(你知道7段是什么吗?),我需要输入字符串正好有四个字符。你读过C编译器的文档吗(例如…)?现在我知道什么是微控制器了。谢谢你的解释。我把我小时候不知道的东西放进了“”里。当时,微控制器是一种罕见的东西,而对于富裕得多的孩子来说,个人电脑……strlen的建议对OP的原始代码不起作用,因为这里传递的字符串不是空的-terminated@M.M我认为这是OPS代码中的一个bug。我很确定OP不打算使用“太长”的初始值设定项。只是一个典型的C错误。可能不是错误,而是一个无法解释的限制。可能有原因,可能是可以更改的设计事故。允许使用OP的定义,并创建不包含null的数组strings@M.M你说得对,这是有效的C代码。例如,strlen()就不起作用。虽然这“很酷”,但我认为它并不能真正解决问题。示例:
charstr[4]=“ab”将通过宏检查,但通过的时间太短string@4386427你只能走这么远,试图阻止有人朝自己的脚开枪。在任何情况下,函数都需要运行时检查有效字符,以便为LED生成命令。仔细考虑后,您的答案可能是正确的。我只是假设输入是一个有效的C样式字符串,但OP从未明确说明这一点。我已经要求OP澄清,并在我的回答中添加了一个disclamer。让我们看看会发生什么…我也想了解你的建议,但我不能让它工作,因为我有很多错误。请再加一些代码好吗?“也许我用错了。”MohammadKholghi看到了吗
char boy[] = "David";
char girl[] = "Jane";
assert(names[0] != '\0' &&
       names[1] != '\0' &&
       names[2] != '\0' &&
       names[3] != '\0' &&
       names[4] == '\0');
#define getCh(x) (_Static_assert(sizeof(x) == 4, "Size is not 4"), getCh(x))