为何用for循环与printf打印C语言缓冲区字符结果不一致?
问题分析与修复方案
核心问题1:加密结果包含ASCII控制字符,导致打印异常
你的加密算法 hc = (ch + (count*2))%128 会生成0127的ASCII值,其中**031是不可见的控制字符**(比如'\0'、退格\b、回车\r等):
- 用
printf("%s")打印字符串时,会把'\0'当成字符串结束标志,直接截断输出; - 像退格、回车这类控制字符会干扰终端输出位置,看起来像是“遗漏字符”;
- 实时输出时你同时打印了字符和ASCII值,所以能看到所有结果,但后续直接打印字符时,控制字符不会显示为可见内容。
核心问题2:for循环遍历范围错误
你写的循环条件是 for(int i=0; i<= count; i++),但buffer[count]是手动添加的'\0'(字符串结束符),这个位置不需要打印,应该改成 i < count,否则会多打印一个无效的空字符。
潜在问题:路径读取不支持空格
scanf("%s", path)会在遇到空格、制表符时停止读取,如果你的文件路径包含空格,会导致路径读取不完整,建议替换为fgets处理带空格的路径。
修复后的代码示例
#include <stdio.h> #include <string.h> #include <stdbool.h> void encrypt(char* path ); void decrypt(char* ); int main(void){ printf("Hello, please enter the path of the file you want to encrypt\n"); char path[1024]; // 替换scanf为fgets,支持带空格的路径 fgets(path, sizeof(path), stdin); // 去掉fgets读取的换行符 char *newline = strchr(path, '\n'); if (newline != NULL) { *newline = '\0'; } printf("File Path:%s\nFile encrypted content: \n",path); FILE *file = fopen(path, "r+"); if(file==NULL){ printf("Cannot open file \n"); system("pause"); return 1; } int ch; int count = 0; char buffer[1024]; while((ch=fgetc(file))!= EOF){ int hc = (ch + (count*2))%128; printf("Original character: %c (ASCII value: %d) ", ch, ch); buffer[count] = hc; count++; printf("Encrypted character: %c (ASCII value: %d)\n", hc, hc); if (count >= sizeof(buffer)-1){ printf("Buffer size exceeded\n"); break; } } buffer[count] = '\0'; printf("\nThis is the complete buffer (with ASCII values to avoid control char issues):\n"); // 修改循环条件,只遍历有效加密字符 for(int i=0; i< count; i++){ // 同时打印字符和ASCII值,避免控制字符干扰视觉 printf("[%c] (%d) ", buffer[i], buffer[i]); } printf("\nThis is the buffer as string (may be truncated by \\0): %s\n", buffer); fclose(file); system("pause"); return 0; }
额外优化建议
如果需要让加密后的内容完全可显示、可正常存储,建议调整加密算法,确保结果落在ASCII可打印字符区间(32~126):
// 修改加密公式,限制结果在32~126之间 int hc = (ch + (count*2))%95 + 32;
内容的提问来源于stack exchange,提问作者Winzer Prince
相关产品推荐
相关产品推荐

