1

大家好,我创建了一个简单的小密码函数,它可以获取一个指向字符串的指针,然后将每个字节更改为其相应的加密字符,如果您通过该函数运行它,它会将文本转换回纯文本。

不过我的问题是我想将此函数与const char *p = "...";声明的变量一起使用,但这根本不可能,因为它们在运行时加载到内存中并且不可写。

这是我的功能。

char *Cipher(char *str)
{
    char *p = str;

    while(*p)
    {
        if(*p >= ' ' && *p <= 'O')
        {
            *p = ((*p + 48) % 127);
        }
        else if(*p >= 'P' && *p <= '~')
        {
            *p = ((*p - 48) % 127);
        }

        p++;
    }
    return str;
}

它只需要一个指向字符串的指针,然后替换所有字符并将指针返回到字符串(这样我就可以在其他函数中使用它,例如 printf 或任何接受char*作为参数的函数)。

现在我知道为了使用这些const char*指针,我必须将它们复制到本地内存中以修改它们,但是如何返回指向新编码或解码的字符串的指针,以便我可以将它传递给其他函数。(最终目标是将它包含在一个简单的聊天程序中,我想把它称为类似的东西send(sock, Cipher(PRE_HEADER), strlen(PRE_HEADER));)而且我认为我这样做的方式不会是线程安全的,所以以防万一我决定将它与线程一起使用应用程序我必须进行哪些更改?

我也接受简单字符串替换密码的其他替代代码。

任何帮助,将不胜感激。谢谢你。

4

3 回答 3

0

你将不得不使用

strncpy( str, All.c_str(), sizeof( str ) );

在一些辅助函数中或在您调用之前

send(sock, Cipher(PRE_HEADER), strlen(PRE_HEADER));
于 2013-03-14T03:52:46.733 回答
0

您可以尝试将变量声明为char数组而不是char指针,例如:

char p[] = "...";

您将获得与以前几乎相同的效果-您可以传递p给一个函数,它会很好地衰减为一个指针-但不是存储在只读内存中,而是存储在p声明它的位置(或者在堆栈内部一个函数,或者如果您将其设为静态,则在程序的数据段中)。

于 2013-03-14T04:03:44.437 回答
0

您可以使用复制Cipher函数中的字符串strdup并对其进行处理,并返回新字符串的指针。

就像是:

char *Cipher(char *str)
{
    char *new_string = strdup(str);
    char *p = new_string;

    while(*p)
    {
        if(*p >= ' ' && *p <= 'O')
        {
            *p = ((*p + 48) % 127);
        }
        else if(*p >= 'P' && *p <= '~')
        {
            *p = ((*p - 48) % 127);
        }

        p++;
    }
    /* return new_string not p */
    return new_string;
}

此外,您必须如下更改调用方代码才能在strlen函数中使用新字符串。但是,如果您真的知道传递给的字符串长度Cipher始终与返回字符串相同,那么您仍然可以使用strlen(PRE_HEADER).

str = Cipher(PRE_HEADER);
send(sock, str, strlen(str));
于 2013-03-14T04:04:11.330 回答