C语言猜数字游戏中如何验证输入是否仅为字符
问题
我正在学习C语言,开发一款“猜数字”游戏,需求如下:
- 获取玩家姓名并验证其是否仅包含字符
- 计划添加彩色文本等功能丰富游戏内容
当前游戏代码如下:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> int main() { // Initialize array for storing the playes name, players guess, counter for attempts to guess, a bool for the loop // // and lowest and highest number for the random number generator. // char player_name[10]; int player_guess; int count_tries = 0; bool run_game = false; int lower = 1, higher = 10; // Generate a ranom number // srand(time(NULL)); int rand_num = rand() % (lower -higher) + 1; // Welcome message // printf("WELCOME TO THE GUESSING GAME\n"); printf("Try to guess the secret number between 1 and 10\n\n"); // printf("Rand number: %d\n\n", rand_num); // Get players name // printf("What is you name: ", player_name); scanf("%s", &player_name); } // Game Loop // do { printf("%s what you guess: (between 1 and 10)", player_name); scanf("%d", &player_guess); if (player_guess < rand_num) { printf("%s your guess waa too low!\n", player_name); count_tries++; } if (player_guess > rand_num) { printf("%s your guess was too high!\n", player_name); count_tries++; } if (player_guess == rand_num) { printf("Congratulations %s you guessed the correct number!!!\n", player_name); count_tries++; printf("You guessed the correct number in %d attempts.\n", count_tries); break; } } while(run_game = true); return 0; }
我尝试了以下代码但无法实现姓名验证:
if (player_name != char) { printf("Names can only be characters");
请问如何实现验证玩家姓名输入仅为字符的功能?
解决方案
一、实现姓名仅含字符的验证逻辑
你之前的错误在于试图直接把数组和char类型比较,这在C语言里是不成立的。正确做法是遍历姓名的每个字符,检查是否为字母(可根据需求调整规则,比如允许空格或连字符):
- 引入
ctype.h头文件,它提供了isalpha()等字符判断函数 - 编写验证逻辑,遍历数组检查每个字符
示例验证代码:
#include <ctype.h> // 必须引入该头文件 // 验证姓名是否仅包含字母(可自行扩展允许的字符,比如空格、连字符) bool is_valid_name(const char *name) { if (name[0] == '\0') { // 空输入直接判定无效 return false; } for (int i = 0; name[i] != '\0'; i++) { // 仅允许字母,若要支持空格可改为 !isalpha(name[i]) && name[i] != ' ' if (!isalpha(name[i])) { return false; } } return true; }
修改获取姓名的逻辑,循环直到用户输入有效姓名:
// 循环获取姓名,直到输入有效 do { printf("What is your name: "); scanf("%9s", player_name); // 限制输入长度,避免数组越界(数组长度为10,留1位存结束符'\0') if (!is_valid_name(player_name)) { printf("Error: Names can only contain letters. Please try again.\n"); } } while (!is_valid_name(player_name));
二、修复原代码中的其他bug
你的现有代码还有几个问题需要修正:
- 随机数生成错误:原代码
rand() % (lower - higher) + 1会生成负数,正确公式是rand() % (higher - lower + 1) + lower,这样才能生成1到10之间的随机数 - scanf参数错误:
scanf("%s", &player_name);应改为scanf("%s", player_name);,数组名本身就是指针,不需要取地址符& - 循环条件错误:
while(run_game = true)是赋值操作,应改为while(true)(因为你用break退出循环),或者先将run_game设为true再用while(run_game) - 语法错误:获取姓名的代码块多了一个闭合大括号
},导致后续代码不在main函数内
三、添加彩色文本功能
在终端中可以通过ANSI转义序列实现彩色输出,Windows需要额外启用支持:
// Windows下启用ANSI转义支持(需包含windows.h) #ifdef _WIN32 #include <windows.h> void enable_color() { HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); DWORD mode; GetConsoleMode(hConsole, &mode); SetConsoleMode(hConsole, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING); SetConsoleOutputCP(CP_UTF8); } #else #define enable_color() // Linux/macOS无需额外操作 #endif // 使用示例 enable_color(); printf("\033[32mCongratulations %s you guessed the correct number!!!\033[0m\n", player_name); // 绿色文本 printf("\033[31m%s your guess was too high!\033[0m\n", player_name); // 红色文本
\033[XXm是颜色控制码,\033[0m用于重置颜色回到默认,常用颜色码:31红、32绿、33黄、34蓝等。
内容的提问来源于stack exchange,提问作者Lacochina
相关产品推荐
相关产品推荐

