我有两个单词列表。
我的代码随机选择一个列表,然后随机选择列表中的一个单词。
代码工作正常,但我收到incompatible pointer type
警告。
问题似乎出现在p = list1
。
但是,p
和list1
都有char*
类型,所以我不理解这个警告。
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
void test() {
srand(time(NULL)); // seed the random number generator.
const char *list1[3] = { "one", "two", "three" }; // first list
int len1 = 3;
const char *list2[4] = { "uno", "dos", "tres", "quatro" }; // second list
int len2 = 4;
char **p; // variable to hold chosen list
int pcount; // size of the chosen list
char word[64] = "none"; // chosen word
int ran1 = rand() % 2; // random number 0 or 1
if (ran1 == 0) { p = list1; pcount = len1; } // warning: assignment from incompatible pointer type
if (ran1 == 1) { p = list2; pcount = len2; } // warning: assignment from incompatible pointer type
strcpy(word, p[rand() % pcount]);
printf("The word is %s.\n", word);
return;
}
答案 0 :(得分:3)
list1
是const char*
的数组
p
是char**
。
您无法将指针指针指向 - const
指向指向非指针的指针 - const
。
您需要将p
声明为const char**
。
<小时/> 在评论中完成CannedMoose发布的the link 此外,be careful使用带有双指针的
const
。
答案 1 :(得分:3)
您的代码中存在多个问题:
p
应定义为const char **p
以与const char *list[]
兼容。len1
和len2
变量初始化为计算出的数组长度,以避免较大集合上的潜在差异。ran1
上用于选择集合的测试既冗余又可能不完整。您应确保涵盖ran1
的所有值并让编译器知道。已启用所有警告的正确配置的编译器会抱怨p
和pcount
可能未初始化。test()
会选择相同的单词。以下是修改后的版本:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
void test(void) {
const char *list1[] = { "one", "two", "three" }; // first list
int len1 = sizeof(list1) / sizeof(list1[0]);
const char *list2[] = { "uno", "dos", "tres", "quatro" }; // second list
int len2 = sizeof(list2) / sizeof(list2[0]);
const char **p; // variable to hold chosen list
int pcount; // size of the chosen list
char word[64]; // chosen word
int ran1 = rand() % 2; // random number 0 or 1
if (ran1 == 0) {
p = list1; pcount = len1;
} else {
p = list2; pcount = len2;
}
strcpy(word, p[rand() % pcount]);
printf("The word is %s.\n", word);
}
int main() {
srand(time(NULL)); // seed the random number generator.
test();
test();
test();
test();
return 0;
}