指向C中数组的第一个元素

时间:2018-09-23 18:34:39

标签: c arrays pointers element

很抱歉,如果您已经提出了这个问题,我在发布之前进行了搜索,但找不到答案。

我有此代码:

#include<stdio.h>
#include<stdlib.h>

#define ESC 27

typedef struct{
    int data[10];
    int n;
} tlist;

void menu(){
    printf("Options:\n");
    printf("1) Show list\n");
    printf("ESC) Quit\n");
}

void showList(tlist *list){
    int *p;
    p = &list->data[0];
    if(list->n == 0){
        printf("Empty list!\n\n");
    }else{
        for(int i=0; i<list->n; i++){
            printf("%d \n", *p);
            p++;
        }
    }
}

int main(){
    char choice;
    tlist list;
    list.n = 10;

    list.data[0] = 16;  
    list.data[1] = 17;
    list.data[2] = 18;
    list.data[3] = 19;
    list.data[4] = 20;
    list.data[5] = 21;
    list.data[6] = 22;
    list.data[7] = 23;
    list.data[8] = 24;
    list.data[9] = 25;
    do{
        menu();
        scanf("%s",&choice);
            switch(choice){
                case '1': showList(&list);
                    break;
                case ESC:
                    printf("quiting...\n");
                    break;
                default:
                    printf("Invalid Choice!\n");
                    break;      
            }
    }while(choice != ESC);
    return 0;
}

当我运行该程序时,我将得到以下输出:

0 17 18岁 19 20 21 22 23 24 25

我不明白为什么第一个打印是数组中第一个元素的位置,而不是第一个元素本身。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

choicechar,在scanf中使用的正确的转换说明符是c而不是s

在将scanf插入打印新行(printf的{​​{1}}语句时,也必须小心。

\n具有转换说明符scanf时,它将把任何空格解释为字符,而不会等待实际的输入。因此,这里的c应该通过包含前导空格来留出空白字符。

因此scanf语句应为:

scanf

在程序中继续进行之前,最好检查scanf(" %c", &choice); 的返回值。根据标准,scanf返回分配的输入项目数,如果匹配失败,则该数目可以少于提供的数目,甚至为零。