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

C语言中scanf读取的first变量无法输出问题求助

问题分析与解决方案

你的代码中first变量无法输出的核心问题是**strcspn的字符集参数错误**,同时存在栈越界风险,可能意外覆盖了first的内容。

具体问题点:

  1. strcspn字符集错误:你写的"[/r/n]"是普通字符集合(包含[、/、r、n、]),而非要匹配的换行符\n和回车符\r。这导致strcspn找不到换行符,当返回值等于address的长度时,执行address[strcspn(...)] = 0可能越界写入栈内存——由于栈向下增长,address的后续地址可能指向first的内存区域,把first的第一个字符改成\0,最终printf输出时first显示为空。
  2. 输入缓冲区处理不严谨:fgetc(stdin)只能读取一个字符,如果用户输入last name后有多余空白字符,无法完全清除缓冲区,可能影响后续输入。

修正后的代码:

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

int main()
{
    // 数组大小预留结束符位置,避免越界
    char first[10], last[10], address[20], city[10], state[3], zipcode[6];

    printf("\n\nPart 3:\n");
    printf("Please enter your name and address:\n");
    
    printf("First Name: ");
    scanf("%9s", first); // 限制读取9个字符,留位置存结束符
    
    printf("Last Name: ");
    scanf("%9s", last);
    
    // 彻底清除输入缓冲区剩余字符(含换行)
    while (getchar() != '\n');
    
    printf("Address: ");
    fgets(address, sizeof(address), stdin);
    // 正确匹配换行/回车符,去除换行
    address[strcspn(address, "\r\n")] = 0;
    
    printf("City: ");
    scanf("%9s", city);
    
    printf("State: ");
    scanf("%2s", state); // 州缩写为两位,限制读取长度
    
    printf("Zipcode: ");
    scanf("%5s", zipcode); // 邮编5位,限制读取长度
    
    // 优化输出格式,提升可读性
    printf("%s %s\n%s\n%s, %s, %s\n", first, last, address, city, state, zipcode);

    return 0;
}

关键修改说明:

  • 修正strcspn的字符集为"\r\n",正确去除fgets读取到的换行符。
  • 用while (getchar() != '\n');替代fgetc(stdin),彻底清除输入缓冲区剩余内容。
  • 给每个scanf添加长度限制(如%9s对应10字节数组),避免输入过长导致数组越界。
  • 调整zipcode数组大小为6(5位数字+结束符),避免越界。
  • 优化输出格式,让地址和城市分行显示,更符合阅读习惯。

测试你的输入示例,修正后的代码会输出:

Ben Johnson
1234 Smith St
Townsville, CA, 12345

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:15:36