这是hackerrank的一个练习题:https://www.hackerrank.com/challenges/caesar-cipher-1。 我的输出与程序的预期输出匹配,但输出字符串的末尾有一个未知字符。有人请告诉我如何在字符串末尾出现未知字符。 这是我的代码:
#include <iostream>
#include <string>
#include<cstdio>
using std::cin;
using std::string;
using std::cout;
using std::endl;
int main()
{
int k,n;
string text;
cin>>n;
cin>>text;
cin>>k;
for (int i = 0; i <n; i++)
{
if(text[i] != '\0') //check if the character is null
{
if(isalpha(text[i])) //check if the character is alphabet
{
int d=(int)text[i] ; //obtain the ascii value
int t=d+k; //obtain the encrypted value
if(t>122) //if the encrypted value of character is greater than 122
{
int extra=t-122;
int letter=97 +(extra-1);
string ans= string()+char(letter);
cout<<ans;
}
string ans= string()+char(t); //print the encrypted character
cout<<ans;
}
else //if the character is not string, then print it just like that
{
cout<<text[i];
}
}
}
}
示例输出:qmhhpi-Syxd
我的输出:qmhhpi-Syxd~
答案 0 :(得分:3)
您的代码中存在很少的错误:
if(t>122)
中,您正在检查加密字符(由Caesar cypher)是否具有大于122的值(Z的ASCII)。但是,如果它的值最初在A-Z范围内然后增加了键,那该怎么办呢? int extra=t-122;
int letter=97 +(extra-1);
n
,那么为什么使用if(text[i] != '\0')
。 string ans= string()+char(t); cout<<ans;
。 cout << char(t);
答案 1 :(得分:2)
问题是循环中有两个字符串ans
的输出。因此,当当前字母为'z'
(输入字符串的最后一个字母)时,首先执行if语句,打印字母'd'
然后打印statmenets
string ans= string()+char(t); //print the encrypted character
cout<<ans;
也被执行,输出t的初始值。
int t=d+k;
您应该使用if-else
声明。
考虑到代码不安全非常冗余,并使用像122
这样的幻数,这使得它不清楚。
您应该包含标头<cctype>
,因为您正在使用此标头中声明的函数isalpha
。
#include <cctype>
标题<cstdio>
应该被删除,因为此标题中没有使用任何声明。
要输出字符,无需创建std::string
类型的对象。例如,而不是这些陈述
string ans= string()+char(t); //print the encrypted character
cout<<ans;
你可以写
cout << char( t );