我在C中尝试字符串数组。我有一个字符串的字典数组,我添加单词然后打印出数组以查看它是否有效。正如我认为的那样输出可以打印出数组中的单词。但是我得到了一些我无法解决的警告。
// 20 word dictionary
#define ROWS 20
#define WORD_LENGTH 10
char dictionary[ROWS][WORD_LENGTH];
void add_word(char **dict, int index, char *word) {
dict[index] = word;
}
char *get_word(char **dict, int index) {
return dict[index];
}
void print_dictionary(char **dict) {
int i;
for (i = 0; i < 20; i++) {
printf("%d: %s\n", i, get_word(dict, i));
}
}
void test_dictionary() {
add_word(dictionary, 0, "lorem");
add_word(dictionary, 1, "ipsum");
print_dictionary(dictionary);
}
int main() {
test_dictionary();
}
编译它的输出是,
p5.c: In function ‘test_dictionary’:
p5.c:54:2: warning: passing argument 1 of ‘add_word’ from incompatible pointer type [enabled by default]
p5.c:38:6: note: expected ‘char **’ but argument is of type ‘char (*)[10]’
p5.c:55:2: warning: passing argument 1 of ‘add_word’ from incompatible pointer type [enabled by default]
p5.c:38:6: note: expected ‘char **’ but argument is of type ‘char (*)[10]’
p5.c:57:2: warning: passing argument 1 of ‘print_dictionary’ from incompatible pointer type [enabled by default]
p5.c:46:6: note: expected ‘char **’ but argument is of type ‘char (*)[10]’
我尝试将** dict更改为dict [ROWS] [WORD_LENGTH]没有太大区别。你能解释一下如何声明这个字典参数吗?感谢。
编辑:我的编译器标志是CFLAGS = -Wall -g。
Edit2:将声明更改为,
void add_word(char dict[][WORD_LENGTH], int index, char *word) {
dict[index] = word;
}
char *get_word(char dict[][WORD_LENGTH], int index) {
return dict[index];
}
void print_dictionary(char dict[][WORD_LENGTH]) {
int i;
for (i = 0; i < 20; i++) {
printf("%d: %s\n", i, get_word(dict, i));
}
}
这会产生编译错误,
p5.c: In function ‘add_word’:
p5.c:42:14: error: incompatible types when assigning to type ‘char[10]’ from type ‘char *’
make[1]: *** [p5] Error 1
感谢您的帮助。
啊!弄清楚了!。因为它是一个指针,我需要按照@Jack的建议使用strcpy。
void add_word(char dict[][WORD_LENGTH], int index, char *word) {
/*dict[index] = word;*/
strcpy(dict[index], word);
}
谢谢大家!
答案 0 :(得分:5)
根本原因:
数组不是指针!
请注意,没有从dict[][]
到dict **
的隐式转换,因此也就是错误。当你将一个数组传递给一个函数时,它会作为指向它的第一个元素的指针衰减。在二维数组的情况下,第一个元素是单个维数本身的数组,所以你需要一个指向数组的指针,而不是一个双指针。
Soultion:
您需要修改您的函数原型以匹配您传递的类型。
void add_word(char dict[][WORD_LENGTH], int index, char *word);
void print_dictionary(char dict[][WORD_LENGTH]);
答案 1 :(得分:2)
事实是你真的没有传递一个指向指针的指针,而是一个数组数组。不同之处在于已经分配了内存,并且您无法在add_word()中使用赋值运算符“=”。
正确的签名是
void add_word(char dict[][WORD_LENGTH], int index, char *word)
并且您必须使用strcpy或strncpy
之类的方法答案 2 :(得分:1)
在解除引用时,您需要提供内部数组的大小。所以而不是:
void add_word(char **dict, int index, char *word)
你需要:
void add_word(char dict[][WORD_LENGTH], int index, char *word)
同样适用于print_dictionary
。
主要的困惑是char 数组数组与char 指针数组不同。
答案 3 :(得分:1)
是的,你的类型已完全关闭。
修复的“最小更改次数”只是替换一行:
char* dictionary[ROWS];
基本上,你创建了一个内存为
的内存块c1 c2 c3 c4 ... c20
c21 c22 c23 c24 ... c40
c41 c42 ...
...
但是,你把它用作
的内存块charpointer1
charpointer2
charpointer3
...
它似乎工作正常,你的实际分配的内存块无论如何都更大,所以它甚至是“安全的”,从某种意义上来说,没有任何不好的事情会发生。
编辑:如果您曾试图直接使用“词典”,您的代码就会“爆炸”;访问例如得到第n个单词的“dictionary [n]”会给你错误的结果。