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

自定义scanf实现出现Segmentation fault (core dumped)问题求助

自定义scanf函数触发Segmentation Fault问题排查

我正在尝试实现一个自定义版的scanf函数,想通过自定义格式字符串限制输入长度——用@N%d替代标准的%d,以此规定输入的数字不能超过N位。目前写了部分代码,但运行时总是弹出Segmentation fault (core dumped)错误,代码里用到了strtok函数,麻烦帮忙排查下问题根源。

我目前的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdarg.h>

char** str_split(char* a_str, const char a_delim);
void myscanf(char *input_format, ... );

int main(int argc, char** argv) {
    int x;
    myscanf("@2%d", &x); // 补全原代码中省略的参数,推测是要传入变量地址
    return 0;
}

// 注:原提问中未贴出str_split和myscanf的具体实现代码

可能导致段错误的核心原因分析

  • strtok操作只读字符串:strtok函数会直接修改传入的原字符串,但格式字符串"@2%d"属于字符串常量,存储在程序的只读数据段中,不允许被修改。如果直接对input_format调用strtok,会触发内存访问错误,这是这类问题最常见的诱因。
  • 内存分配/指针初始化问题:如果str_split函数中存在未初始化的指针,或者分割字符串时没有正确分配内存,后续访问这些非法内存地址会直接导致段错误。
  • 可变参数处理不规范:myscanf使用va_list处理可变参数时,如果va_start、va_arg、va_end的调用不符合规范(比如参数类型不匹配、没有正确终止),也可能引发内存异常。
  • 格式字符串解析越界:在解析@N%d格式时,如果没有做边界检查,比如读取N时超出了格式字符串的长度,会触发越界访问错误。

针对性的修复建议

  1. 避免修改只读字符串:在使用strtok前,先把格式字符串复制到一块可写的内存区域,比如用strdup分配内存:
    void myscanf(char *input_format, ... ) {
        char *format_copy = strdup(input_format);
        if (format_copy == NULL) {
            perror("Failed to allocate memory");
            return;
        }
        // 使用format_copy调用strtok进行分割操作
        // ...
        free(format_copy); // 记得释放内存,避免泄漏
    }
    
  2. 检查str_split的内存逻辑:确保str_split中每个分割后的子字符串都通过malloc/strdup分配了内存,并且返回的指针数组最后要以NULL结尾,防止后续遍历越界。
  3. 规范可变参数流程:严格按照标准流程处理可变参数:
    va_list args;
    va_start(args, input_format); // 第二个参数必须是函数的最后一个固定参数
    // 根据格式字符串解析结果,用va_arg获取对应类型的参数
    // 比如int *ptr = va_arg(args, int*);
    va_end(args); // 必须调用以清理可变参数列表
    
  4. 添加边界检查:解析格式字符串时,检查每个字符的索引是否在合法范围内,比如读取@后的数字N时,确保不会读到字符串末尾之外。

内容的提问来源于stack exchange,提问作者nima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:21:47