字符串迭代报错‘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
相关产品推荐
相关产品推荐

