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

字符串迭代报错‘expression must have a pointer-to-object type’求助

解决字符串转数字数组时的「expression must have a pointer-to-object type」错误

嘿,我来帮你搞定这个问题~你碰到的那个错误,根源是几个关键的代码细节没处理对,咱们一个个说清楚:

1. 直接导致报错的原因:函数参数类型错误

你定义的函数参数是char str,这表示单个字符,但你要处理的是字符串(字符数组/指针)。单个字符不能用str[i]这种索引方式访问,编译器就会抛出「expression must have a pointer-to-object type」的错误。

把参数改成指针类型就好:

void separate_nums(char *str, int str_len) {
// 或者用const char*,因为输入字符串不需要修改
// void separate_nums(const char *str, int str_len) {

2. 字符转数字的逻辑错误

你直接把字符赋值给int数组元素,比如str[i]是字符'8',它的ASCII码是56,这样存到数组里的是56而不是8。需要减去字符'0'的ASCII值来转换:

// 错误写法
new_arr[idx] = str[i];
// 正确写法
new_arr[idx] = str[i] - '0';

3. 数组索引的混乱问题

原来的代码用循环的i同时遍历字符串和给数组赋值,遇到'-'的时候会导致数组出现空缺。比如处理"-2"时,i=0是'-',你把值存在new_arr[0],然后i变成1,下一次循环i=1时会跳过这个位置?不对,应该用一个单独的索引变量(比如idx)来跟踪数组的当前位置,这样每次处理一个数字就给数组加一个元素,不会乱。

修正后的完整代码

void separate_nums(const char *str, int str_len) {
    int new_arr[20];
    int i = 0;
    int idx = 0; // 单独跟踪数组的索引位置

    while (i < str_len) {
        if (str[i] == '-') {
            // 处理负数:取后面的字符转数字,加负号
            new_arr[idx] = -(str[i + 1] - '0');
            i += 2; // 跳过'-'和它后面的数字
        } else {
            // 处理正数:字符转数字
            new_arr[idx] = str[i] - '0';
            i += 1;
        }
        idx++; // 数组索引每次都前进一位
    }

    // 这里可以加个打印测试,验证结果
    for (int j = 0; j < idx; j++) {
        printf("%d ", new_arr[j]);
    }
}

比如输入"809-2-3",这个函数会生成[8, 0, 9, -2, -3],完全符合你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:32:15