字符串末尾的未知字符

时间:2016-01-29 06:44:13

标签: c++ string

这是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~

2 个答案:

答案 0 :(得分:3)

您的代码中存在很少的错误:

  1. if(t>122)中,您正在检查加密字符(由Caesar cypher)是否具有大于122的值(Z的ASCII)。但是,如果它的值最初在A-Z范围内然后增加了键,那该怎么办呢?
    因此,这两行不正确。
    int extra=t-122; int letter=97 +(extra-1);
  2. 你的代码不连贯。如果您已经将字符串的长度指定为n,那么为什么使用if(text[i] != '\0')
    另外,为什么要使用string ans= string()+char(t); cout<<ans;
    正如@chris所指出的,这两行可能只是cout << char(t);
  3. 由于 K 可以在 [0,100] 之间变化,因此最好将其带有26的MOD。您可以在此处查看正确的代码:Ideone link

答案 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 );