C语言用户名密码程序开发求助:代码无响应问题排查
问题排查与代码修正
你的程序之所以没有响应,是因为代码里存在逻辑死循环和多个语法/逻辑错误,咱们一步步拆解问题:
核心问题分析
- 死循环陷阱:你用
goto loop1直接跳回while(a[i]!='\r'),但此时i的值始终是0(第一次进入for循环时i=0,执行a[i]=getch()后立刻跳转,for循环的i++根本没机会执行)。而且a[0]是未初始化的随机值,大概率不等于'\r',导致程序一直在while和goto之间无限循环,完全无法进行后续操作。 - 语法错误:
puts('*')是错误的,puts()函数需要传入字符串(双引号包裹),单引号的'*'是字符类型,类型不匹配,应该改为puts("*")或者用printf("*")更合适。 - 数组越界风险:你定义的
char a[10]最多能存9个字符加一个结束符'\0',但循环条件i<=10会访问a[10],这属于数组越界,会导致未定义行为。 - 未初始化问题:数组
a没有被初始化,初始值都是随机垃圾值,while(a[i]!='\r')的判断毫无意义。 - 非标准写法:
main()没有返回值类型声明,标准C要求int main();另外conio.h是Windows平台特有的头文件,getch()在某些编译器(比如GCC)下可能无法使用,不过咱们先解决核心逻辑问题。
修正后的代码
下面是修复了所有问题、符合需求的代码:
#include <stdio.h> // 如果是Windows平台,保留conio.h;如果是Linux/macOS,可以用ncurses库,这里先按Windows场景处理 #ifdef _WIN32 #include <conio.h> #else // 非Windows平台的替代方案,需要先安装ncurses库,编译时加-lncurses #include <ncurses.h> #define getch() getch() #endif int main() { char username[11]; // 最多10位,留一位存结束符 char password[11]; int i = 0; char ch; // 获取用户名 printf("请输入用户名(最多10位):"); fgets(username, 11, stdin); // 去掉fgets读取的换行符 if (username[strcspn(username, "\n")] == '\n') { username[strcspn(username, "\n")] = '\0'; } // 获取密码,输入时显示* printf("请输入密码(最多10位):"); while (i < 10) { ch = getch(); // 判断是否按下回车(兼容Windows和类Unix系统) if (ch == '\r' || ch == '\n') { break; } password[i++] = ch; printf("*"); // 每输入一个字符显示一个* } password[i] = '\0'; // 添加字符串结束符,保证输出正常 // 输出结果 printf("\n\n用户名:%s\n", username); printf("密码:%s\n", password); printf("密码长度:%d\n", i); return 0; }
代码说明
- 用户名输入用
fgets(),可以安全读取最多10位字符,同时处理换行符,避免缓冲区溢出。 - 密码输入部分:循环读取每个字符,判断是否是回车(兼容Windows的
'\r'和类Unix的'\n'),每输入一个字符就输出一个*,直到输入回车或达到10位限制。 - 给密码数组添加了字符串结束符
'\0',保证后续printf能正常输出字符串。 - 处理了跨平台的
getch()问题,注释里说明了不同平台的适配方式。
内容的提问来源于stack exchange,提问作者Ma8hths Indou
相关产品推荐
相关产品推荐

