[英]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)函数返回一个整数。 它应该返回一个指向字符串的指针
在C函数原型中, char ARR[]
实际上只是char *
语法糖,因为函数调用将数组转换为指向数组第一个元素的指针。 因此sizeof(ARR)
将具有与sizeof(char *)
相同的值。 您需要将实际长度作为单独的参数传递。
如果randint(n)
返回从1到n的数字,请注意C中的数组索引操作从索引0开始,而不是从索引1开始,因此您需要从randint(n)
的返回值中减去1才能获得索引。在0到n-1的范围内。
您的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[]
。
然后,您返回一个char
( ARR[r]
)。 因此,您应该在printf()
语句中使用%c
而不是%s
。
要么将const char ARR[]
更改为const char* ARR[]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.