很抱歉,如果您已经提出了这个问题,我在发布之前进行了搜索,但找不到答案。
我有此代码:
#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
我不明白为什么第一个打印是数组中第一个元素的位置,而不是第一个元素本身。有人可以解释一下吗?
答案 0 :(得分:1)
choice
是char
,在scanf
中使用的正确的转换说明符是c
而不是s
。
在将scanf
插入打印新行(printf
的{{1}}语句时,也必须小心。
当\n
具有转换说明符scanf
时,它将把任何空格解释为字符,而不会等待实际的输入。因此,这里的c
应该通过包含前导空格来留出空白字符。
因此scanf
语句应为:
scanf
在程序中继续进行之前,最好检查scanf(" %c", &choice);
的返回值。根据标准,scanf
返回分配的输入项目数,如果匹配失败,则该数目可以少于提供的数目,甚至为零。