C:定义函数,该函数采用常量字符串数组,返回随机选择的一个

时间:2018-09-27 16:17:44

标签: c

我在用C语言处理字符串时遇到麻烦。对不起,我通常在Math Stackexchange上学习。这是我的函数,它接收一串字符串并返回一个随机选择的字符串。 randint(int n)是一个函数,它返回一个从1到n的随机整数。

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

这是我的main():

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*)'

基本上,我的困惑是数据类型之间。我做错了什么?谢谢。

4 个答案:

答案 0 :(得分:1)

忽略rand_word是100%错误的事实,只需要处理错误消息即可。

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

更改rand_word以接受char *ARR[]

现在rand_word是错误的

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

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

答案 1 :(得分:1)

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

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

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

总而言之,您的"%s"函数应如下所示:

printf

由于您的rand_word数组包含3个元素,因此您的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

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

printf

然后您的 printf("%s", rand_word(3, WORDS)); 呼叫可以是这样的:

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

答案 2 :(得分:0)

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;
}

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

答案 3 :(得分:-1)

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

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

可以选择将const char ARR[]更改为const char* ARR[]