我在用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*)'
基本上,我的困惑是数据类型之间。我做错了什么?谢谢。
答案 0 :(得分:1)
忽略rand_word是100%错误的事实,只需要处理错误消息即可。
您有一个声明为以char数组(char [])作为参数的函数。您正在将其和指针数组传递给char数组。那是无效的。
更改rand_word以接受char *ARR[]
现在rand_word是错误的
a)sizeof(ARR)始终为4或8。其指针大小。您不能检查指向数组的指针并确定数组的长度。传递第二个参数,长度为
b)该函数返回一个int。它应该返回一个指向字符串的指针
答案 1 :(得分:1)
在C函数原型中,char ARR[]
实际上只是char *
的语法糖,因为函数调用将数组转换为指向数组第一个元素的指针。因此sizeof(ARR)
将具有与sizeof(char *)
相同的值。您需要将实际长度作为单独的参数传递。
如果randint(n)
返回从1到n的数字,请注意C中的数组索引操作从索引0开始,而不是从索引1开始,因此您需要从{的返回值中减去1。 {1}}来获取0到n-1范围内的索引。
您的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[]
。
然后返回一个char
(ARR[r]
)。因此,您应该在%c
语句中使用%s
而不是printf()
。
可以选择将const char ARR[]
更改为const char* ARR[]
。