字典程序中的“下标值既不是数组也不是指针”错误

时间:2012-01-23 01:22:38

标签: c

我正在尝试编写字典程序。用户输入条目和定义。我遇到了我写的显示功能问题。我收到了这个错误:

dictionary.c:7: error: subscripted value is neither array nor pointer

这是我的代码:

#include <stdio.h>

void display (char *array) {
    int i;

    for (i=0; i<11; ++i)
        printf("%s %s\n", array[i][0], array[i][1]);
}

int main(void) {
    char *dictionary[10][2];
    int command;
    int i;

    while (command != 3) {
        printf ("1. Define or 2. Lookup or 3. Exit");
        scanf ("%d", &command);

        if (command == 1) {
            for (i=0; i<11; ++i) {
                printf("Please enter a word to define:");
                scanf("%s\n", dictionary[i][0]); 
                printf("Please enter its definition:");
                scanf("%s", dictionary[i][1]);
                break;
            }
        }

        if (command == 2)
            display(dictionary);
    }

    return 0;
}

我不确定我理解。字典不是数组吗?为什么我会收到此错误?

3 个答案:

答案 0 :(得分:2)

在display()中,数组被声明为指针,因此可以将其视为一维数组;但是你将它用作二维数组。

答案 1 :(得分:2)

函数array的参数display()的类型不正确。如果您希望将dictionary传递给它,则其类型应为char *(*)[2]

void display (char *array[][2])
{

然后您将遇到另一个问题,即您从未初始化组成数组char *的{​​{1}}值。你不能将它们传递给dictionary,直到它们指向一个合理的地方。

答案 2 :(得分:1)

void display (char *array) {
...
printf("%s %s\n", array[i][0], array[i][1]);

array的类型为char*,因此array[i]的类型为char。您无法将[]索引运算符应用于char

char *dictionary[10][2];
...
display(dictionary);

display()需要char*类型的参数。 dictionary的类型为char*[10][2],或者是指向char的2元素数组的10元素数组。它隐式转换为指向char的2元素指针数组的指针,但仍与char*不兼容。

要记住的一些事情:

二维数组只是一个数组数组。

在大多数情况下,数组表达式被隐式转换为指向数组第一个元素的指针;有关详细信息,请参阅comp.lang.c FAQ的第6部分。

使用索引运算符时,x [y] , x is a pointer and y`是一个整数。指针值通常是转换数组的结果,但它可以只是一个指针(恰好指向数组的第一个元素)。

哦,具有scanf格式的"%s"是危险的。它会将任意多个字符读入指定的目标数组;你不能将它限制为数组的大小。