我正在尝试在C中验证密码,并且每当代码运行时,我的else
个语句之一就会自动触发。我运行一个测试来查看一个字符是否是一个符号,如果它是int symbol
使用symbol++;
加1,但问题是这个代码正在执行,无论我测试的字符是否是一个符号。
我认为这个问题与我的if, else
语句的结构有关,而且我已经尝试了几种组合,但有些错误导致程序失效我使用了{{1}但这并没有帮助。这似乎应该是非常明显的,但我似乎无法弄清楚错误。
else if
答案 0 :(得分:2)
在您的代码中,更改
for (i = 0; i <= len; i++)
到
for (i = 0; i < len; i++)
as,C
数组具有基于0
的索引。否则,你可能超越分配的内存,而内存又会调用undefined behaviour。
注意:即使你没有超出内存(因为你有一个编译时分配的数组,输入可能小于实际的数组大小),你最终会比较终止{ {1}},这可能是你不想要的。
然后,nul
检查不应该是独立的 isdigit()
(根据您的逻辑),它应该是if
else if
那就是说,
isalpha()
应该是
scanf("%s", &password);
以避免任何可能的缓冲区溢出风险。
答案 1 :(得分:1)
该行
symbol++;
将在输入alpha时执行。
为防止这种情况发生,请在else
测试之前插入isdigit
。
else if (isdigit(password[i])) {
其他人指出,循环也是错误的。它应该是
for (i = 0; i < len; i++) {
答案 2 :(得分:1)
您的代码如下所示:
if (cond1){}
if (cond2){}
else {}
在这种情况下,else
- 块的执行独立于cond1
- 块,如C11标准草案第6.8.4.1节所述:$ 3:An else is associated with the lexically nearest preceding if that is allowed by the syntax.
您可以将代码的结构更改为:
if (cond1){}
else if (cond2){}
else {}