Указание на первый элемент массива в C - PullRequest
0 голосов
/ 23 сентября 2018

Извините, если этот вопрос уже задавался, я немного искал перед публикацией, но не смог найти на него ответ.

У меня есть этот код:

#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 голосов
/ 26 сентября 2018

choice - это char, а верный спецификатор преобразования, который будет использоваться в scanf, - это c, а не s.

. Следует также соблюдать осторожность при использовании scanf с вкраплениямис printf операторами, которые печатают новые строки (\n).

Когда scanf имеет спецификатор преобразования c, он будет интерпретировать любые пробелы как символ и не будет ждать фактического ввода,Таким образом, scanf здесь должен учитывать пробельные символы, включая пробел в начале.

Так что выражение scanf должно быть:

scanf(" %c", &choice);

Это также хорошая практикапроверить возвращаемое значение scanf, прежде чем продолжить в программе.Согласно стандарту scanf возвращает количество назначенных элементов ввода, которое может быть меньше предусмотренного или даже равно нулю в случае неудачного раннего сопоставления.

...