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

C语言使用scanf读取不定长坐标输入时如何确定存储数组大小

代码现存问题排查
  • 格式匹配逻辑错误:读取double类型变量时,scanf必须使用%lf格式符,原代码用的%f对应float类型指针,会导致读取的坐标值完全错误;代码中写的/n是字符转义错误,正确的换行转义是\n,且这里完全不需要显式匹配换行——scanf会自动跳过输入流中所有的空白字符(空格、换行、制表符),多余的匹配规则反而会导致读取逻辑卡住。
  • 固定数组越界风险:原代码定义的长度为25的临时数组,只要用户输入超过25个坐标,就会发生栈内存越界,直接触发程序崩溃。
  • 变长数组的稳定性问题:原代码在循环结束后定义的double xval[i], yval[i]属于栈上分配的变长数组,当输入的坐标点数量过大时,会直接超出栈的内存上限,没有任何容错能力。
适配不定长输入的实现方案

首先需要明确一个核心局限:交互场景下无法实现“先完整读取输入统计行数,再回头重新读取坐标存入数组”的逻辑。因为标准输入(键盘输入、管道输入)是顺序流,读到EOF之后就没有剩余数据了,无法倒回输入流的起始位置重新读取,这个思路仅适用于可寻址的磁盘文件场景,控制台交互场景下完全不适用。
适合课程实验的稳定实现方案,是通过动态内存分配实现自适应扩容的读入逻辑,全程严格遵循必须用scanf完成输入的要求,具体逻辑为:

  1. 初始化时分配一个基础容量的存储数组(比如初始可存储16个坐标点,覆盖大部分实验场景)
  2. 每通过scanf读入一个坐标,检查当前已存储的坐标数是否达到数组容量上限
  3. 如果容量不足,就通过realloc将数组容量扩容为原来的2倍,再继续读入
  4. 直到读到EOF停止读入,此时数组实际容量刚好匹配用户输入的坐标数量

对应的参考实现代码如下:

#include <stdio.h>
#include <stdlib.h>

void readPointsFindBoundingBox(double *bottomLeftX, double *bottomLeftY, double *widthp, double *heightp)
{
    printf("Enter coordinates: ");
    int capacity = 16; // 初始存储容量
    int pointCount = 0;
    // 动态分配初始的x、y坐标存储数组
    double *xValues = (double*)malloc(capacity * sizeof(double));
    double *yValues = (double*)malloc(capacity * sizeof(double));

    double tempX, tempY;
    // 严格使用scanf完成读入,读到EOF即停止
    while (scanf("%lf %lf", &tempX, &tempY) != EOF)
    {
        // 检查当前容量是否足够存入新坐标
        if (pointCount >= capacity)
        {
            capacity *= 2; // 容量翻倍,减少扩容操作次数
            xValues = (double*)realloc(xValues, capacity * sizeof(double));
            yValues = (double*)realloc(yValues, capacity * sizeof(double));
        }
        xValues[pointCount] = tempX;
        yValues[pointCount] = tempY;
        pointCount++;
    }

    // 基于读入的坐标计算外接框(示例逻辑)
    if (pointCount == 0)
    {
        *bottomLeftX = *bottomLeftY = *widthp = *heightp = 0;
        free(xValues);
        free(yValues);
        return;
    }
    double minX = xValues[0], maxX = xValues[0];
    double minY = yValues[0], maxY = yValues[0];
    for (int i = 0; i < pointCount; i++)
    {
        if (xValues[i] < minX) minX = xValues[i];
        if (xValues[i] > maxX) maxX = xValues[i];
        if (yValues[i] < minY) minY = yValues[i];
        if (yValues[i] > maxY) maxY = yValues[i];
    }
    *bottomLeftX = minX;
    *bottomLeftY = minY;
    *widthp = maxX - minX;
    *heightp = maxY - minY;

    // 动态申请的内存使用完成后必须释放
    free(xValues);
    free(yValues);
}

该实现无固定容量限制,无论用户输入1个还是上千个坐标点,都不会出现容量不足或栈溢出的问题,完全符合课程实验的要求。如果课程尚未讲授动态内存分配,固定长度数组的方案无法从根本上适配不定长输入的场景,仅能通过设置足够大的容量、同时增加越界提示的方式降低崩溃概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 08:36:03