C语言如何读取RSA私钥文本文件并拆分提取各组成字段?
问题根因
- 缓冲区无字符串终止符:C语言中字符串以
\0作为结束标记,fread接口仅负责按字节读取内容到缓冲区,不会自动追加终止符。printf("%s")输出时会持续读取内存直到遇到\0,如果缓冲区末尾无终止符,就会出现截断、乱码问题。 - 缓冲区大小不足:你定义的
private_size数组大小为2070,而完整的私钥文本大小刚好接近甚至超过该值,导致末尾内容未被读入缓冲区,出现截断。 - 缺少异常处理:代码未判断文件打开结果,如果文件不存在或无读取权限,后续
fclose操作会触发未定义行为。 - 无效逻辑冗余:代码中
while(size_key>0){size_key=size_key-1;}无任何实际作用,可直接删除。
修复方案
调整后的代码如下:
#include<stdio.h> #include<string.h> // 放大缓冲区,预留终止符空间 #define KEY_BUFFER_SIZE 4096 unsigned char private_size[KEY_BUFFER_SIZE]; int main() { FILE * fp2 = fopen("privateKey.txt", "r"); // 增加文件打开失败判断 if (fp2 == NULL) { printf("privateKey.txt打开失败\n"); return -1; } // 读取时预留1字节位置放终止符,获取实际读取长度 size_t read_bytes = fread(private_size, 1, sizeof(private_size) - 1, fp2); // 手动追加字符串终止符 private_size[read_bytes] = '\0'; fclose(fp2); printf("%s\n", private_size); return 0; }
修改说明
- 缓冲区大小调整为4096,完全覆盖1024位RSA私钥的文本体积
- 读取时预留1字节空间,读取完成后根据实际读取长度手动追加
\0终止符,保证字符串输出正确 - 新增文件打开失败判断逻辑,避免非法内存操作
- 删除无用的循环逻辑
内容的提问来源于stack exchange,提问作者user45698746
相关产品推荐
相关产品推荐

