我正在研究问题集,在创建函数并返回其值时遇到了问题。代码如下:
int shift(char c){
int key;
if (isupper(c)){
key = c - 65;
}else if (islower(c)){
key = c - 97;
}
return key;
}
该函数以字符作为输入并返回一个整数。该整数值将是字母字符减去特定的ascii值,它将按从0到25的顺序设置每个字母数字。当我不初始化key变量时,就会出现问题。当我将其初始化为0时,该函数将按预期工作。
我想知道为什么会这样?我看不到在完成计算后,将键统一化会如何影响其值。
出现的实际错误是:
vigenere.c:48:15: error: variable 'key' is used uninitialized whenever 'if' condition
is false [-Werror,-Wsometimes-uninitialized]
}else if (islower(c)){
您会收到此警告,因为有些代码路径未设置key
,但随后使用。
isupper
和islower
功能不是相反的,例如一个错误的返回值并不意味着另一个错误。例如,c
包含字符'0'
,isupper
和islower
都将返回false。发生这种情况时,将永远不会设置key
的值,因此其值为indeterminate。这意味着无法可靠地预测其值,并且实际上尝试读取它可以调用undefined behavior。
您需要处理两个函数都返回false的情况:
int shift(char c){
int key;
if (isupper(c)){
key = c - 65;
}else if (islower(c)){
key = c - 97;
} else {
key = c;
}
return key;
}
或永远:
int shift(char c){
if (isupper(c)){
return c - 65;
}else if (islower(c)){
return c - 97;
} else {
return c;
}
}