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

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

C语言程序输出异常问题排查与修复

问题根源分析

你的代码存在两个核心错误,直接导致输出不符合预期:

1. 变量声明类型错误

char *first [255]; 和 char *last [255]; 声明的是255个字符指针的数组,而非用来存储字符串的字符数组。未初始化的指针数组指向随机内存地址,用scanf("%s", first)写入会触发未定义行为,这也完全不是存储输入字符串的正确方式。正确写法应为char first[255]; 和 char last[255];。

2. 空格处理逻辑错误

while (getchar() == ' '); 循环会持续读取字符直到遇到非空格字符,但这个非空格字符会被直接丢弃。以输入「Aaron Smith」为例:

  • 第一个循环读取到'A',因不是空格结束循环,但'A'被丢弃,后续scanf("%s", first)只能读取到「aron」;
  • 第二个循环跳过Aaron后的空格,读取到'S'后结束循环,'S'被丢弃,scanf("%s", last)只能读取到「mith」;
  • 最终输出自然是「mith, a」。

修正后的代码

#include <stdio.h>

int main(void) {
    char first[255];
    char last[255];
    
    printf("Enter a first name and a last name: ");
    
    // 跳过开头空格,保留第一个非空格字符
    int ch;
    while ((ch = getchar()) == ' ') ;
    ungetc(ch, stdin); // 将非空格字符放回输入流
    scanf("%s", first);
    
    // 跳过名字后的空格,保留姓氏首字符
    while ((ch = getchar()) == ' ') ;
    ungetc(ch, stdin);
    scanf("%s", last);
    
    printf("%s, %c\n", last, first[0]);
    return 0;
}

关键修改说明

  • 将指针数组改为字符数组,确保有合法内存存储输入字符串;
  • 使用ungetc()把循环中读取到的非空格字符放回输入流,避免被丢弃;
  • 简化输出逻辑,直接用printf输出姓氏和名字首字母,无需额外变量存储首字母。

测试输入「Aaron Smith」时,程序会正确输出「Smith, A」。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:35:19