C语言实现大写字符串按偏移移位时空格丢失问题求解
字符移位程序空格丢失问题修复
问题根因
- 输入读取逻辑错误:
scanf_s的%s格式符只会读取连续非空白字符,遇到空格就会终止读取,所以输入带空格的"AA AA"时,str数组只会存入空格前的"AA",后半段内容根本没有被读入,自然输出不会带空格。 - 字符处理逻辑缺失:现有判断分支没有对空格做特殊处理,就算正确读入完整字符串,ASCII码为32的空格也会进入移位分支被错误修改。
- 移位逻辑冗余:用while循环逐次加减26调整偏移量的写法,在遇到绝对值大于26的偏移量时会做无效循环,执行效率低。
修复方案
- 替换字符串读取逻辑:读完整数偏移量后先清空缓冲区残留的换行符,改用
fgets读取整行内容,支持读入带空格的字符串,同时手动去掉fgets自带的末尾换行符。 - 增加空格判断分支:遍历字符时如果遇到空格直接跳过移位逻辑,原样保留。
- 优化移位计算:先用取模运算把偏移量规整到0-25的范围,再通过0基准索引计算移位结果,避免多层循环判断。
修复后可运行代码
#include <stdio.h> #include <string.h> int main() { char str[100] = {0}, y; int n, x, i = 0; scanf("%d", &n); // 吃掉读数字后留在缓冲区的换行符,避免后续读串异常 getchar(); // 读取整行含空格的字符串,最多读99个字符预留结束符位置 fgets(str, 100, stdin); // 移除fgets读入的末尾换行符 int len = strlen(str); if (str[len-1] == '\n') { str[len-1] = '\0'; len--; } // 把偏移量规整到0-25区间,兼容正负大偏移量 n = n % 26; if (n < 0) n += 26; while (str[i] != '\0') { // 空格直接保留不做移位 if (str[i] == ' ') { i++; continue; } // 大写字母循环移位计算 x = str[i]; y = (x - 'A' + n) % 26 + 'A'; str[i] = y; i++; } printf("%s", str); return 0; }
测试验证
- 输入偏移量-1、字符串"AB CD",输出"ZA BC",符合预期
- 输入偏移量+3、字符串"ABC",输出"DEF",符合预期
- 输入偏移量-1、字符串"AA AA",输出"ZZ ZZ",空格正确保留
内容的提问来源于stack exchange,提问作者agent007
相关产品推荐
相关产品推荐

