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

C语言提取文本坐标存入数组后输出异常问题排查

代码错误分析及修复

核心错误点

1. 输出循环的终止逻辑错误

你用while(koordinatlar[a] != '\0')作为int数组的输出终止条件,这完全不适用:

  • '\0'是字符串的终止符(ASCII值为0),但数组存储的是整数坐标,若坐标本身包含0,会导致输出提前中断;
  • 当数组被完全填满(你的场景中5组坐标刚好占满10个int元素),循环会越界访问数组之外的内存,读取到随机垃圾值,这就是你看到的无关数字。

2. int数组未初始化(潜在风险)

定义int koordinatlar[10];时未初始化,数组中未被赋值的元素会保留内存中的随机值。虽然当前场景刚好填满数组,但如果后续坐标数量变化,未填充的位置会输出垃圾值。

修复方案

最可靠的方式是记录实际存储的元素个数,用这个数值控制输出循环:

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

int main()
{
    char metin[] = "1B(5,5)(13,12)(8,17)(1,10)(5,5)F";
    int koordinatlar[10];
    int count = 0; // 记录实际存储的元素数量
    
    char *ptr = metin;
    
    while(*ptr != '\0')
    {
        if(*ptr == '(')
        {
            int x, y;
            if(sscanf(ptr, "(%d,%d)", &x, &y) == 2)
            {
                koordinatlar[count] = x;
                koordinatlar[count + 1] = y;
                count += 2;
            }
            ptr++;
        }
        else
        {
            ptr++;
        }
    }
    
    // 用实际存储的元素个数控制输出
    for(int a = 0; a < count; a++)
    {
        printf("%d ", koordinatlar[a]);
    }
    return 0;
}

额外优化建议

当前ptr移动逻辑效率较低,每次只移动一个字符。可以在sscanf成功后,直接让ptr跳到当前括号的末尾,避免重复遍历:

if(sscanf(ptr, "(%d,%d)%n", &x, &y, &len) == 2)
{
    koordinatlar[count] = x;
    koordinatlar[count + 1] = y;
    count += 2;
    ptr += len; // 直接跳到当前括号处理完的位置
}

这里%n会记录sscanf处理的字符数,让ptr直接跳过已处理的内容,提升效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:07:31