繁体   English   中英

C:定义 function,它接受常量字符串数组,返回随机选择的一个

[英]C: Define function which takes array of constant strings, returns randomly selected one

我在使用 C 中的字符串时遇到问题。这是我的 function,它接受一个字符串数组并返回一个随机选择的字符串。 randint(int n) 是一个 function,它返回一个从 1 到 n 的随机数 integer。

int rand_word(const char ARR[]) {
    int r = randint(sizeof(ARR));
    return(ARR[r]);
}

这是我的主要():

int main() {
    const char *WORDS[3];

    WORDS[0] = "a";
    WORDS[1] = "b";
    WORDS[2] = "c";

    printf("%s", rand_word(WORDS));

    return 0;
}

我希望看到打印的是“a”、“b”或“c”。

[Error] cannot convert 'const char**' to 'const char*' for argument '1' to 'int rand_word(const char*)'

本质上,我的困惑在于数据类型。 我做错了什么? 谢谢。

忽略rand_word是100%错误的事实就可以处理错误消息。

您具有一个声明为以char数组(char [])作为参数的函数。 您正在将其和指针数组传递给char数组。 那是无效的。

更改rand_word以接受char *ARR[]

现在rand_word错误

a)sizeof(ARR)将始终为4或8。其指针的大小。 您不能检查指向数组的指针并确定数组的长度。 传递第二个参数,其长度为

b)函数返回一个整数。 它应该返回一个指向字符串的指针

  1. 在C函数原型中, char ARR[]实际上只是char *语法糖,因为函数调用将数组转换为指向数组第一个元素的指针。 因此sizeof(ARR)将具有与sizeof(char *)相同的值。 您需要将实际长度作为单独的参数传递。

  2. 如果randint(n)返回从1到n的数字,请注意C中的数组索引操作从索引0开始,而不是从索引1开始,因此您需要从randint(n)的返回值中减去1才能获得索引。在0到n-1的范围内。

  3. 您的rand_word函数采用一个指针,该指针指向char数组的第一个元素,并返回转换为int的数组的单个元素(单个char )。 但是您的调用者向函数传递了一个指向const char *数组的第一个元素的指针,并希望它返回const char * (根据对"%s" printf格式说明符的使用来判断)。

rand_word ,您的rand_word函数应如下所示:

const char *rand_word(int n, const char *ARR[])
{
    int r = randint(n) - 1; // randint returns number in range 1 to n
    return ARR[r];
}

由于您的WORDS数组包含3个元素,因此您的printf调用应类似于:

    printf("%s", rand_word(3, WORDS));

您还可以使用此宏来获取数组的长度(不适用于指针):

#define ARRAY_LEN(ARR) (sizeof (ARR) / sizeof (ARR)[0])

然后,您的printf调用可以是这样的:

    printf("%s", rand_word(ARRAY_LEN(WORDS), WORDS));

const char*实际上是指向数组第一个元素的指针,因此您应该声明: const char WORDS[3]

还请注意, sizeof()将返回数组的大小,索引也以0开头,因此应将其更改为sizeof(ARR)/sizeof(ARR[0])以便返回数组长度并更改函数返回以return ARR[r-1] (使用此方法, 请勿sizeof()更改为sizeof(ARR)/sizeof(ARR[0]) - 1以便包含0)。

另外,您应该更改函数库,因为函数仅返回一个字符而不是字符串! 也许这段代码:

int rand_word(const char ARR[], int length) {
    int returnString[length];
    int r;
    for(int i = 0; i < length; i++)
    {
        r = randint(sizeof(ARR)/sizeof(ARR[0]));
        returnString[i] = ARR[r];
    }

    return returnString;
}

此代码获取一个字母数组和要生成的字符串的长度,而不是传递的数组的长度。

首先,为rand_word()的参数提供*char[] (或char[][] ),而不是char[]

然后,您返回一个charARR[r] )。 因此,您应该在printf()语句中使用%c而不是%s

要么将const char ARR[]更改为const char* ARR[]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM