存储用户输入并提问时遇scanf错误:下标值非数组/指针/向量
解决 scanf 报错:subscripted value is neither array nor pointer nor vector
首先得揪出这个错误的根源——scanf("%s", a[i].incdest) 里的 a[i].incdest 类型不对,%s 格式符要求接收一个字符指针(char*)或者字符数组名(数组名会自动退化为指针),但你当前的结构体里 incdest 大概率不是这两种类型。
最常见的两种问题场景及修复方案:
场景1:结构体里 incdest 定义成了单个字符
比如你的结构体可能是这么写的:
typedef struct { char incdest; // 这里是单个char,不是数组 // 其他成员... } YourStruct; YourStruct a[10]; // 假设a是结构体数组
这种情况下,a[i].incdest 是单个字符变量,不能用 %s 读取字符串,要改成读取单个字符的格式符 %c,注意加空格跳过输入时的换行/空白:
scanf(" %c", &a[i].incdest); // 前面的空格很重要,会跳过之前输入留下的换行符
场景2:你本来想存字符串,但没把 incdest 定义成字符数组
如果你的需求是存储一个字符串(比如用户输入的目的地名称),那结构体里的 incdest 必须定义成字符数组,比如:
typedef struct { char incdest[50]; // 定义足够长度的字符数组,比如50字节存普通字符串 // 其他成员... } YourStruct; YourStruct a[10];
这时候直接用 scanf("%s", a[i].incdest) 就没问题了——因为数组名 a[i].incdest 会自动转换成指向数组首元素的指针,符合 %s 的要求。如果要读取带空格的字符串,建议用 fgets(a[i].incdest, sizeof(a[i].incdest), stdin) 替代 scanf,避免截断。
额外排查点
如果上面两种情况都不是,那得检查:
- 变量
a是否真的是结构体数组?比如有没有写成YourStruct a;(单个结构体变量),那a[i]就会报错,因为单个变量不能用下标访问。 incdest有没有被错误定义成其他非字符类型(比如int、float)?这种情况下肯定不能用%s读取。
内容的提问来源于stack exchange,提问作者point5
相关产品推荐
相关产品推荐

