C语言按分隔符拆分字符串并存储为int数组的赋值问题求助
问题分析与解决
核心错误点
未初始化的输入指针
char *input;仅声明了指针但未分配内存空间,直接执行scanf("%s", &input);会写入非法内存,触发未定义行为。动态数组分配逻辑错误
每次循环都通过calloc重新分配数组:
tab = (int*)calloc((tabSize + 1), sizeof(int));
calloc 会创建一块全新的、初始化为0的内存区域,之前分配的数组会被丢弃(造成内存泄漏),新数组中只有当前赋值的 tab[tabSize] 有有效数据,其余元素均为默认的0,这就是前三个元素为0、仅最后一个元素正常的原因。
- strtok参数类型不匹配
strtok(&input, ",")中,strtok要求第一个参数为char*类型,但此处传入的是char**(&input),属于类型错误,可能导致意外行为。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { // 用固定大小数组存储输入,避免未初始化指针问题,也可根据需求改用动态分配 char input[1024]; int *tab = NULL; int tabSize = 0; // 读取用户输入的字符串 scanf("%s", input); // 首次分割字符串 char *token = strtok(input, ","); while(token != NULL) { // 用realloc扩展数组,保留原有数据 int *temp = realloc(tab, (tabSize + 1) * sizeof(int)); if (temp == NULL) { // 内存分配失败时的错误处理 fprintf(stderr, "内存分配失败\n"); free(tab); return 1; } tab = temp; // 将转换后的整数存入数组对应位置 tab[tabSize] = atoi(token); token = strtok(NULL, ","); tabSize++; } // 遍历打印数组元素 for (int i = 0; i < tabSize; i++) { printf("%d\n", tab[i]); } // 释放动态分配的内存 free(tab); return 0; }
关键修正说明
- 输入处理优化:改用固定大小的
char input[1024]存储输入,简单直接,适合新手快速上手;若需处理超长输入,可替换为malloc动态分配内存。 - 数组扩展逻辑修正:用
realloc替代calloc,realloc会保留原有数组的所有数据并扩展内存空间,彻底解决数据丢失和内存泄漏问题。 - 内存安全保障:增加
realloc失败的判断逻辑,避免空指针操作导致程序崩溃。 - 参数类型修正:直接传入
input(char*类型)给strtok,符合函数参数要求。
内容的提问来源于stack exchange,提问作者Casavier
相关产品推荐
相关产品推荐

