微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Char 在句尾输出随机字符

如何解决Char 在句尾输出随机字符

#include <iostream>
#include <string.h>

using namespace std;

void crypt(char* sMsg)
{
    cout << "Original Message: '" << sMsg << "'" << endl;

    int length = strlen(sMsg);
    char sMsg_Crypt[3][length];
    /*  sMsg_Cryp[3]
        [0] CRYPT LETTERS,ASCII + 3
        [1] INVERT CHAR
        [2] HALF+ OF SENTENCE,ASCII - 1
    */
    
    for (int i=0; i<length; i++)
    {
        if (isalpha((int)sMsg[i]))
            sMsg_Crypt[0][i] = sMsg[i] + 3; // DO ASCII + 3
        else
            sMsg_Crypt[0][i] = sMsg[i];
    }

    cout << "Crypt[0]: '" << sMsg_Crypt[0] << "'" << endl;
}

int main()
{
    char sMsg[256];
    cin.getline(sMsg,256);
    crypt(sMsg);
    
    return 0;
}

输入:

世界你好!测试密码学...

输出

原始消息:'世界你好!测试密码学...'

地穴[0]:'Khoor Zruog! Whvwlqj wkh Fu|swrjudsk|...Çio'

为什么要推出这个Çi­o??

解决方法

对于像这样的初学者可变长度数组

int length = strlen(sMsg);
char sMsg_Crypt[3][length];

不是标准的 C++ 特性。

您至少可以使用 std::string 类型的对象数组,例如

std::string sMsg_Crypt[3];

尽管如此,问题在于数组 sMsg_Crypt[0] 不包含字符串。那是您忘记在数组中附加插入的字符并以零结尾字符 '\0'

你可以在 for 循环之后写

sMsg_Crypt[0][length] = '\0'; 

前提是数组(如果编译器支持 VLA)声明如下

char sMsg_Crypt[3][length+1];
,

首先,您不能像这样定义静态 char 数组:char sMsg_Crypt[3][length];。那是因为 length 不是 const 类型,这意味着数组的大小将为 sMsg_Crypt[3][0] (这是因为在编译时不知道大小)。在 MSVC 中,它会标记错误(通过 IntelliSense)。由于您事先知道大小 (256),因此您可以将 length 替换为 256。

第二个事实是您使用的是 C++ 并且您可以访问 std::string。因此,不使用字符缓冲区,而是使用 std::string。它看起来像这样:std::string sMsg_Crypt[3];

最后一个事实是,要正确读取字符串,它需要以空字符结尾(末尾为 '\0')。这意味着结束字符必须是 '\0'。在 std::string 的情况下,它会为您完成。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。