【发布时间】:2021-02-25 06:07:23
【问题描述】:
这个程序应该加密和解密字符串“myWord”。收到后,通过两种方法加解密,然后返回main。我一直在尝试让它提示用户是否要继续。如果他们输入“n”,则循环停止并且程序结束。如果他们输入“y”,那么它将重复,并且在再次提示他们输入他们的名字后他们将能够再次加密。我尝试了很多不同的方法,但是输入 y 后输出仍然是这样的:
#include <iostream>
#include <string>
using namespace std;
void encrypt(string);
void decrypt(string);
int main() {
string myWord;
char choice = 'y';
while (choice == 'y') {
cout << "Enter a name: ";
getline(cin, myWord);
encrypt(myWord);
cout << "Would you like to encrypt again? (y/n): ";
cin >> choice;
if(choice == 'n') {
return 0;
}
system("pause");
}
return 0;
}
void encrypt(string encrypting) {
for (int i = 0; encrypting[i] != '\0'; i++) {
encrypting[i] = encrypting[i] + 1;
}
cout <<"Encrypted: " << encrypting << endl;
decrypt(encrypting);
}
void decrypt(string decrypting) {
for (int i = 0; decrypting[i] != '\0'; i++) {
decrypting[i] = decrypting[i] - 1;
}
cout << "Decrypted: " << decrypting << endl;
return;
}
我的输出
【问题讨论】:
-
@FantasticMrFox 这并不完全正确。在实践中它们是,甚至在理论上
someString[someString.length()]保证返回'\0'。 -
嗨 liaforu,欢迎来到 SO!您通过发布一个工作代码示例做到了正确,但最好的问题包含最小复制,其中包含仅与问题相关的内容。您的问题与用户输入有关;加密和解密无关紧要。您可以通过将调用
encrypt()的行替换为std::cout << "doing encryption\n";并删除其他两个函数来简化您的示例。想一想:它不会改变你问题的本质,仍然会重现问题,但是将示例减半并使其阅读速度更快! :) -
@FantasticMrFox,这不是真的。 N4713,C++17 的最新工作草案(与标准相同,但免费提供)引用,在 §5.13.5.16 中:“在任何必要的连接之后,在翻译阶段 7 [...] 中,'\0' 是附加到每个字符串文字上,以便扫描字符串的程序可以找到它的结尾。”这是在规范性文本中,在方括号之外。如果你的编译器做的不同,那是编译器的一个错误。