簡體   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