2016-09-16 125 views
-2

我正在尝试编写一个代码来检查大写字母的密码。 当我使用大写字母输入密码时,程序按预期运行(输出'1'和输入的密码)。 但是,如果我输入不带大写字母的密码,程序将崩溃。程序崩溃

我的代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <math.h> 

int main() { 

    char password[100]; 
    int i = 0; 
    int upper = 0; 

    printf("Enter a password with an uppercase letter: "); 
    scanf("%s", password); 

    for (i = 0; i <= 100; i++) { 
     if (isupper(password[i])) { 
      upper = 1; 
      break; 
     } 
    } 

    printf("%d\n", upper); 
    printf("%s\n", password); 

    system("pause"); 
    return (0); 
} 

的错误:

调试断言失败!

计划: ... 15 \项目\ ConsoleApplication3 \调试\ ConsoleApplication3.exe文件: minkernel \ CRT显示器\ ucrt的\ src \ appcrt \转换\ isctype.cpp行:36

表达:C> = -1 & &ç< = 255

有关您的程序如何可以导致断言失败的信息, 看到断言在Visual C++文档。

(按重试以调试应用程序)ConsoleApplication3.exe有 触发了一个断点。

Debug Assertion Failed!

计划: ... 15 \项目\ ConsoleApplication3 \调试\ ConsoleApplication3.exe文件: minkernel \ CRT显示器\ ucrt的\ src \ appcrt \转换\ isctype.cpp行:42

表达:C> = -1 & &ç< = 255

有关您的程序如何可以导致断言失败的信息, 看到断言在Visual C++文档。

(按重试以调试应用程序)ConsoleApplication3.exe有 触发了一个断点。

程序'[13188] ConsoleApplication3.exe'已退出,代码为0 (0x0)。

+5

您有一个100个字符的数组,但您正在访问字符编号101.您也可能会超出输入的字符串,因为您不检查字符串终止符,从而访问未初始化的内存。很抱歉,您对输入没有任何限制,这意味着用户可能会向阵列中写入超过100个字符。所有这些问题导致*未定义的行为*。 –

+0

你可以停在第一个空方式遇到的字符。但消息很有趣。一个字符怎么能'c> = -1 && c <= 255'失败? –

+0

而未被'scanf'填充的数组部分未初始化,因此检查其值是没有价值的。 –

回答

1

更改此:

for (i = 0; i <= 100; i++) { 

for (i = 0; i < 100 && password[i] != '\0'; i++) { 
       ^^^  ^^^^^^^^^^^^^^^^^^ 
     note: no =  check for end of string 

char password[100]; 

所以法律指数只有0〜99另外,你需要检查,如果你已达到字符串的结尾(又名密码[I]!= '\ 0')

做你想要达到的目标(通过@让 - 弗朗索瓦·法布尔启发)更好的办法:

 scanf("%99s", password); 
      ^^ 
      To prevent buffer overflow 

    for (i = 0; i < strlen(password); i++) { 
     .... 
+1

正确的循环将在第一个NULL字符处停止,并且不会一直延伸到100个字。 – PaulMcKenzie

+0

@PaulMcKenzie - 正确。谢谢。答案已更新。 – 4386427

+0

此更改已解决问题(谢谢!),但我不明白为什么。 – Infected

0

变化:

for (i = 0; i <= 100; i++) 

到:

for (i = 0; i < strlen(password); i++) 

注意:如果没有大写字母,则表明您已经出边界。

+0

这是问题,是的。但是,回答相同的事情(但稍微差一些,因为'strlen'在每次迭代时都会运行字符串)而不是当前正确的现有答案。 –