我想针对许多可能的情况进行切换x,有一种情况(在此x == 0)中,我想检查一些其他代码的结果以确定下一步要做什么。一种可能性是比赛早退。
在C语言中,我会使用break此返回值,但遗憾的是不允许这样做。return从父函数(在本例中为main())返回,而不是仅从匹配项返回(即println!,末尾的不会运行!)。
我可以否定子条件(在此处y == 0)并缩进下面的所有代码-但我发现这很丑陋且难以理解。
对于我来说,将子条件放入比赛后卫是没有选择的,因为它太大了。
是否可以在Rust中实现,还是有更好的选择(除了创建另一个子功能或其他解决方法)?
最小示例:
fn main() {
let x = 1;
match x {
1 => {
let y = 0;
/*
* do ev1l stuff to y that I don't want to put into the match-guard
* as it's simply too much.
*/
/* break early ... */
if y == 0 {break;} // > error: `break` outside of …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 openssl AES GCM 方法解密数据。然而,这总是失败并返回代码 0。
我确实在堆栈溢出上搜索了这个,并看到许多关于同一问题的问题。但所有建议的答案都不适合我。
因此再次问同样的问题。
这是我尝试使用的代码
int gcm_encrypt(std::vector<uint8_t>& key, std::vector<uint8_t>& plainText, std::vector<uint8_t>& encData)
{
unsigned char iv[AES_BLOCK_SIZE] = {'T', 'H', 'I', 'S', 'I', 'S', 'S', 'E', 'C', 'R', 'E', 'T', 'K', 'E', 'Y', 'Y'};
unsigned char tag[AES_BLOCK_SIZE] = {0};
int encDataLen = plainText.size() + EVP_CIPHER_block_size(EVP_aes_256_gcm()) + sizeof(tag);
unsigned char* et = (unsigned char*) calloc(encDataLen, sizeof(unsigned char));
std::cout << "Plain text Len: " << plainText.size() << std::endl;
std::cout << "Tag Len: " << sizeof(tag) << std::endl;
std::cout << …Run Code Online (Sandbox Code Playgroud) 我正在通过比较两个字符串之间不同的第一个值来实现strcmp(char *s, char *t)返回 <0 if s<t、0 ifs==t和 >0 if s>t。
通过分离后缀增量和关系等于运算符来实现:
for (; *s==*t; s++, t++)
if (*s=='\0')
return 0;
return *s - *t;
Run Code Online (Sandbox Code Playgroud)
然而,分组后缀增量和关系等于运算符不起作用(像这样):
while (*s++ == *t++)
if (*s=='\0')
return 0;
return *s - *t;
Run Code Online (Sandbox Code Playgroud)
后者总是返回 0。我认为这可能是因为我们增加指针的速度太快了,但即使两个字符串的差异出现在 10 个索引 5 处,仍然产生相同的结果。
示例输入:
strcomp("hello world", "hello xorld");
返回值:
0
我的预感是这是因为运算符优先级,但我并不乐观,如果是这样,我无法准确指出原因。
感谢您的时间!