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

C语言程序无法正确输出姓名首字母,请求问题排查

问题分析与修复

你的代码无法输出所有姓名首字母,核心问题出在输出逻辑和循环处理上,以下是具体问题点和修复方案:

原代码的关键问题

  • 初始输出逻辑错误:printf("%s %c", name, toupper(name[0]))先输出了完整姓名,再重复输出第一个首字母,完全偏离“提取所有首字母”的需求。
  • 循环处理缺失核心步骤:遇到空格时仅输出空格并跳过字符,但没有输出空格后单词的首字母大写形式,这是导致其余首字母不显示的直接原因。
  • scanf格式符冗余:%[^\n]本身已定义读取所有字符直到换行,后面加s会导致格式匹配失败,需删除多余的s。
  • 循环效率低下:每次循环都调用strlen(name)重复计算字符串长度,建议提前存储长度值。

修正后的代码

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
    printf("请输入你的全名: ");
    char name[50];
    // 修正scanf格式符,移除多余的s
    scanf("%[^\n]", name);
    
    // 输出第一个单词的首字母大写形式
    printf("%c", toupper(name[0]));
    
    int len = strlen(name);
    for(int i = 1; i < len; i++)
    {
        if(name[i] == ' ')
        {
            // 输出空格后,直接输出下一个字符的大写形式
            printf(" %c", toupper(name[++i]));
        }
    }

    printf("\n");
    return 0;
}

关键修改说明

  1. 重构输出逻辑:删除原代码中输出完整姓名的部分,直接从第一个首字母开始输出。
  2. 补全首字母提取步骤:遇到空格时,先输出空格,再将i自增到空格后的位置,输出该位置字符的大写形式。
  3. 修复输入格式符:保留%[^\n]读取整行输入,移除冗余的s避免匹配失败。
  4. 优化循环效率:提前将字符串长度存入len变量,避免循环中重复调用strlen。

测试示例:输入Bob Dylan Smith,输出结果为B D S,符合提取所有姓名首字母的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:49:59