C语言中标准输入空格检查功能失效问题排查
C语言注册登录程序输入异常问题修复
问题根源分析
你的程序出现输入直接跳过的问题,核心有两个错误:
fscanf格式字符串错误:你写的%[^\n]s\n是无效写法。%[^\n]本身就是完整的转换说明,用于读取所有非换行符的字符,后面额外加的s会让fscanf尝试匹配输入中的s字符,而你的输入里没有这个字符,导致匹配失败,直接跳过读取操作。- 输入缓冲区残留换行符:用
scanf("%d", &choice)读取整数后,你按下的回车键(换行符\n)会留在输入缓冲区中。而%[^\n]转换说明不会自动跳过前导空白字符,所以后续的fscanf会直接读取到这个换行符,由于%[^\n]要求读取非换行符的字符,匹配失败,程序直接执行后续代码,出现连续打印提示的情况。
修复方案及代码示例
下面是修正后的完整代码,同时补充了必要的错误处理(避免内存泄漏、文件操作失败等问题):
#include <stdio.h> #include <stdlib.h> int main() { printf("1. Register\n"); printf("2. Login\n"); printf("Please enter your choice: "); int choice; // 用空格跳过输入后的空白字符(包括换行) if (scanf("%d ", &choice) != 1) { printf("Invalid input\n"); return 1; } FILE *file = fopen("data.txt", "a"); if (file == NULL) { printf("File cannot be opened\n"); return 1; } // 简化malloc写法,无需强制转换,指定长度避免溢出 char *name = malloc(64); if (name == NULL) { printf("name malloc failed\n"); fclose(file); return 1; } char *password = malloc(64); if (password == NULL) { printf("password malloc failed\n"); free(name); fclose(file); return 1; } if (choice == 1) { printf("Enter username: "); // 限制读取63个字符,避免缓冲区溢出 if (fscanf(stdin, "%63[^\n]", name) != 1) { printf("Username input failed\n"); } else { fprintf(file, "%s\n", name); } // 读取掉缓冲区剩余的换行符,避免影响下一次输入 getchar(); printf("Enter password: "); if (fscanf(stdin, "%63[^\n]", password) != 1) { printf("Password input failed\n"); } else { fprintf(file, "%s\n", password); } getchar(); } // 释放内存,关闭文件 free(name); free(password); fclose(file); return 0; }
关键修改点说明
- 修正格式字符串:将
%[^\n]s\n改为%63[^\n],63是为了预留一个字节存储字符串结束符\0,避免缓冲区溢出。 - 处理残留换行符:在
scanf("%d ", &choice)中加入空格,让scanf自动跳过所有后续空白字符(包括换行);或者在读取整数后调用getchar()手动吃掉换行符。 - 完善错误处理:
malloc、fopen、scanf失败时,及时释放已分配的内存、关闭文件并退出程序,避免程序崩溃或资源泄漏。 - 移除无用变量:原代码中
userInput未被使用,已直接删除,减少不必要的内存分配。
内容的提问来源于stack exchange,提问作者MBI
相关产品推荐
相关产品推荐

