C语言存储用户输入时触发Abort trap:6错误的排查请求
解决scanf输入ID和分数时的"Abort trap: 6"错误
我来帮你排查这个问题,其实核心错误出在ID的存储结构和scanf的参数使用上,咱们一步步理清楚:
问题1:ID数组定义错误
你现在写的char id[10];是一个只能存储10个单个字符的数组,但你要存的是10个字符串类型的ID(比如像"S001"这种)。单个字符数组根本装不下完整的ID字符串,这直接导致后续输入时内存越界,触发"Abort trap: 6"错误。
正确的做法是用二维字符数组,比如char id[10][21];——这里第一个维度10对应10个用户,第二个维度21表示每个ID最多可以存20个字符(留1个位置给字符串结束符'\0',C语言字符串必须以这个结尾)。
问题2:scanf参数错误
你给%s传了&id[i],这不对:id[i]是单个char的变量,&id[i]是单个char的地址,而%s需要的是一个指向字符串首地址的指针(也就是char*类型)。如果改成二维数组,直接写id[i]就可以,因为id[i]本身就指向第i个ID字符串的首字符。
另外,为了防止输入的ID太长超过数组长度,最好给%s加长度限制,比如%20s,这样即使输入太长也只会截取前20个字符,避免内存溢出。
问题3:打印逻辑错误
你用%c打印id[i],这是打印单个字符,而你要打印的是完整的ID字符串,应该用%s格式符。
修正后的完整代码
#include <stdio.h> #define MAX_ID_LENGTH 20 // 定义每个ID的最大长度 int main (void){ char id[10][MAX_ID_LENGTH + 1]; // 二维数组,存10个ID,每个ID留结束符位置 int mark[10]; for (int i=0;i<10;i++){ printf("Enter ID and mark: \n"); // %20s 限制输入长度,id[i]直接作为字符串首地址 scanf(" %20s %d", id[i], &mark[i]); } for (int i=0;i<10;i++){ // 用%s打印完整ID,同时输出对应的分数 printf("ID: %s, Mark: %d\n", id[i], mark[i]); } return 0; }
额外说明
你之前说不加&无法编译,是因为原来的id[i]是单个char,%s需要char类型,类型不匹配所以报错。改成二维数组后,id[i]就是char类型,不需要加&就能正常编译运行啦。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

