首先,我进入C++课程已有四周时间,我甚至还不知道循环,所以请说说话宝贝?
好的,所以我应该从文件中读取十二个字符串(加上NULL使得十三个),然后将字母向后移三个,然后将结果打印到屏幕和文件.除了换字母之外,我还好.我不想写几英里的代码来单独取每个字符,减去三个,然后重新组合字符串,但我不确定如何一次处理整个字符串.有人可以推荐一种非常简单的方法吗?
如果您正在处理简单字母(A到Z或a到z),那么您可以假设内部代码是线性的.
字母编码为0到127之间的数字.A编码为65,B编码为66,C编码为67,Z编码为90.
为了移动字母,你只需更改内部字母代码就好像它是一个数字,所以基本上只是从字符中减去3.但请注意边缘情况,因为将3减去'A'会给你'>'(代码62)而不是'X'(代码88).您可以使用"if"语句或模运算符("%")来处理它们.
这是一个ASCII字符表来帮助您
一旦你加载了你的字符串,你可以使用modulous运算符旋转,同时保持在AZ空间的范围内.
我会跟踪这封信是否是开头的资本:
bool isCaps = ( letter >= 'A' ) && ( letter <= 'Z' ); if( isCaps ) letter -= 'A'-'a';
然后就像这样做密码转换:
int shift = -3; letter -= 'a'; // to make it a number from 0-25 letter = ( letter + shift + 26 ) % 26; // add 26 in case the shift is negative letter += 'a'; // back to ascii code
终于完成了
if( isCaps ) letter += 'A'-'a';
所以,把所有这些放在一起我们得到:
char *mystring; // ciphertext int shift = -3; // ciphershift for( char *letter = mystring; letter; ++letter ) { bool isCaps = ( *letter >= 'A' ) && ( *letter <= 'Z' ); if( isCaps ) *letter -= 'A'-'a'; letter -= 'a'; letter = ( letter + shift + 26 ) % 26; letter += 'a'; if( isCaps ) letter += 'A'-'a'; }