//函数开始:
char *encrypt(char *string, size_t length) {
}
我正在开始一个简单的加密功能,我想知道上面的代码究竟在执行什么操作?我假设我正在将加密函数初始化为char指针,其存储目标为“字符串”,大小为“长度”
我正确吗?
答案 0 :(得分:0)
它定义(实现)一个名为encrypt
的函数。如果尚未声明,它也可能声明。
此函数有两个参数:
string
且类型为char *
(指向char
的指针)length
的类型size_t
该函数返回一个char *
(指向char
的指针)。
可以使用任何类型的变量来调用该函数,这些变量是(或可以转换为)指向char
和size_t
的指针。例如,以下内容有效:
char some_string[] = "foobar";
encrypt(some_string, strlen(some_string));
答案 1 :(得分:0)
摘要
char *encrypt(char *string, size_t length) {
}
定义名为encrypt
的函数,该函数将char *
和size_t
作为参数,并返回char *
。如所写,函数主体为空,并且将触发至少一个诊断,因为它没有返回值。
它看起来像是要使用未加密的字符串作为string
参数,并返回其加密版本:
char unenc[] = "This is a test";
char *enc = encrypt( unenc, strlen( unenc ) );
由于C处理数组表达式的原因,我们正在处理指针。 string 是包含0值终止符的字符值序列-字符串“ hello”表示为序列{'h', 'e', 'l', 'l', 'o', 0}
。字符串存储在字符类型的数组中(对于ASCII,EBCDIC和UTF-8编码,为char
;对于诸如“ UTF-16”的“宽”编码,为wchar_t
)。
但是,除非它是sizeof
或一元&
运算符的操作数,或者是用来初始化声明中的字符数组的字符串 literal ,否则<数组类型的em> expression 被转换(“衰减”)为指针类型的表达式,表达式的值是数组第一个元素的地址。
我们将unenc
定义为char
的数组,其大小足以容纳字符串"This is a test"
(14个字符加上0终止符)。当我们将unenc
作为参数传递给encrypt
时,它会从类型char [15]
“衰减”到char *
,而函数实际接收的是的第一个元素的地址数组(&unenc[0]
)。
数组表达式不能是赋值的目标,函数不能返回数组类型。但是encrypt
是为了在内部工作,它不能将加密的字符串作为数组返回;它只能返回一个指向存储字符串的数组的第一个元素的指针。
现在,在不知道实现的情况下,encrypt
可能就地加密了字符串 ,覆盖了数组的原始内容,并返回了相同的地址:
char *encrypt( char *string, size_t length )
{
for ( size_t i = 0; i < length; i++ )
string[i] = replace_char( string[i] );
return string;
}
由于string
被声明为char *
,而不是const char *
,因此这是一个合理的推断。而且它将避免内存管理的麻烦。当然,您正在破坏输入,因此存在一些折衷。
如果未进行适当的加密,则encrypt
函数需要分配新的内存,或者使用在函数生命周期之外可用的内存(已声明为{{1}的全局或局部) },这会带来自己的头痛):
static