C语言中如何使用scanf()获取输入的char数组(%s)的长度
问题解决方法
问题根因
你遇到的输出长度固定为1的问题,由两个核心错误导致:
- 数组初始化不符合需求:
char chr[] = ""等价于声明了长度为1的char数组,仅能存储字符串结束符\0,直接用scanf("%s", chr)写入输入内容会触发缓冲区溢出,属于未定义行为,可能导致程序崩溃、数据篡改等异常。 - 长度计算方式错误:
sizeof运算符的作用是统计变量本身占用的内存字节数,你的chr数组初始化时长度就固定为1,因此无论输入什么内容,sizeof(chr)的返回值永远是1,无法统计输入字符串的实际有效长度。
正确实现步骤
- 给存储输入的char数组分配足够大的固定长度,同时使用
scanf时增加长度限制,规避缓冲区溢出风险。 - 引入标准库
<string.h>,使用库函数strlen()计算输入字符串的有效长度:该函数会从字符串首地址开始逐字符统计,直到遇到结束符\0为止,返回的长度不包含\0本身。
修正后完整代码
#include <stdio.h> #include <string.h> // 定义缓冲区最大长度,可根据实际输入场景调整大小 #define BUFFER_LENGTH 1024 char chr[BUFFER_LENGTH] = {0}; int n; // 标准C规范要求main函数返回值为int类型 int main() { printf("\n"); printf("Enter a character: "); // 限制输入长度不超过BUFFER_LENGTH-1,预留1位存储字符串结束符 scanf("%1023s", chr); printf("You entered %s.", chr); printf("\n"); n = strlen(chr); printf("length n = %d \n", n); printf("\n"); return 0; }
内容的提问来源于stack exchange,提问作者Riemann
相关产品推荐
相关产品推荐

