C语言姓名处理程序异常修复求助:输入单名仅输出首字符
问题与解决方案
问题现状
当前程序执行情况:
- 输入
BillyJoel(名和姓通过大写字母分隔)时,能正确输出Billy和Joel - 输入单一名字如
Billy时,仅输出字符B,不符合需求
需要实现:输入仅为名字时,输出提示语Only first name entered以及完整姓名(如Billy)。
原代码问题分析
原代码默认输入字符串中一定存在大写字母作为名和姓的分隔符,但当输入单一名字时,第一个循环找不到大写字母,变量j未被初始化,导致后续截取名字时出现未定义行为(比如只输出B),同时姓氏部分也会出错。
修改后的代码
#include <stdio.h> #include <string.h> int main() { char name[80], first[40], last[40]; int i, j, k; int has_last_name = 0; printf("Enter your first and last name or just your first name: "); scanf("%s", name); // 遍历寻找作为分隔符的大写字母 for (i = 1; i < strlen(name); i++) { if (name[i] >= 'A' && name[i] <= 'Z') { j = i - 1; has_last_name = 1; break; } } if (has_last_name) { // 提取名字部分 for (k = 0; k <= j; k++) { first[k] = name[k]; } first[k] = '\0'; // 提取姓氏部分 for (j = 0; name[i] != '\0'; j++) { last[j] = name[i]; i++; } last[j] = '\0'; printf("%s\n", first); printf("%s\n", last); } else { // 仅输入名字的情况 strcpy(first, name); printf("Only first name entered\n"); printf("%s\n", first); } return 0; }
关键修改点
- 添加状态标记:新增
has_last_name变量,用来判断输入中是否包含姓氏(即是否找到大写分隔符) - 修复未初始化变量问题:避免原代码中
j未赋值导致的未定义行为 - 优化可读性:用字符常量
'A'和'Z'替代ASCII硬编码值,代码更直观 - 处理单一名字场景:当未找到分隔符时,直接将输入内容作为完整名字,输出要求的提示语和姓名
内容的提问来源于stack exchange,提问作者billyjoe2
相关产品推荐
相关产品推荐

