You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键修改点

  1. 添加状态标记:新增has_last_name变量,用来判断输入中是否包含姓氏(即是否找到大写分隔符)
  2. 修复未初始化变量问题:避免原代码中j未赋值导致的未定义行为
  3. 优化可读性:用字符常量'A'和'Z'替代ASCII硬编码值,代码更直观
  4. 处理单一名字场景:当未找到分隔符时,直接将输入内容作为完整名字,输出要求的提示语和姓名

内容的提问来源于stack exchange,提问作者billyjoe2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:55:23