[英]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.