You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:36:56