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
相关产品推荐
相关产品推荐

