C语言中scanf读取的first变量无法输出问题求助
问题分析与解决方案
你的代码中first变量无法输出的核心问题是**strcspn的字符集参数错误**,同时存在栈越界风险,可能意外覆盖了first的内容。
具体问题点:
strcspn字符集错误:你写的"[/r/n]"是普通字符集合(包含[、/、r、n、]),而非要匹配的换行符\n和回车符\r。这导致strcspn找不到换行符,当返回值等于address的长度时,执行address[strcspn(...)] = 0可能越界写入栈内存——由于栈向下增长,address的后续地址可能指向first的内存区域,把first的第一个字符改成\0,最终printf输出时first显示为空。- 输入缓冲区处理不严谨:
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
相关产品推荐
相关产品推荐

