C语言如何用scanf读取用户输入生成字符串?正确获取字符串长度的方法
C语言字符串读取与长度计算问题修复
一、用scanf正确读取有效字符串的方法
- 必须提前为字符串分配足够的连续内存空间,不能使用空的未初始化字符数组。C语言标准不允许定义长度为0的数组,这种写法下数组没有实际分配可用内存,scanf直接往里写数据就会触发内存访问违规(也就是你之前遇到的段错误)。C语言的字符串以
'\0'作为合法结束标记,读取的内容必须预留至少1个位置存放该结束符。比如需要存最多99个用户输入的可见字符,就定义大小为100的字符数组,多出来的位置专门给结束符使用。 - 调用scanf读取字符串时,必须指定最大读取长度,防止缓冲区溢出。比如写为
scanf("%99s", string),其中数字99代表最多读入99个非空白字符,不会超过之前定义的100大小的数组容量。
注意:
%s格式符的特性是遇到空格、制表符、换行符等空白输入就会停止读取,匹配你要求的“输入无空格字符串”的使用场景。
二、正确计算输入字符串实际长度的方法
- 之前的
sizeof(*string)写法存在本质错误:string作为函数参数传入时,已经退化为指向首字符的指针,*string就是单个char类型的变量,sizeof计算它的大小自然只有1字节,完全无法反映实际输入的字符串长度。这也是你之前程序只能打印第一个字符的直接原因——因为计算出来的length固定为1,循环只会执行1次。就算在main函数内对字符数组用sizeof,得到的也是数组的总内存容量,不是用户实际输入的字符数。 - C标准库提供了专门的字符串长度计算函数
strlen(),它的执行逻辑是从传入的字符串首地址开始逐位遍历,直到遇到第一个'\0'结束符就停止,返回遍历经过的字符个数(不包含结束符本身)。 - 使用
strlen()前必须引入头文件<string.h>,且必须保证传入的字符串是带'\0'结束标记的合法字符串,否则函数会持续越界读取内存,轻则计算出错误长度,重则触发段错误。
修复后可正常运行的完整代码
#include <stdio.h> #include <string.h> int scanString(char *string); int main(void) { // 数组大小设为100:足够存99个用户输入的字符 + scanf自动追加的字符串结束符'\0' char string[100]; scanString(string); return 0; } int scanString(char *string) { printf("Enter a string without spaces and hit enter: "); // 限制scanf最多读取99个字符,避免超过数组容量造成内存越界 scanf("%99s", string); // 调用strlen获取实际输入的字符串长度,自动识别'\0'结束标记 int length = strlen(string); for(int i = 0; i < length; ++i){ printf("%c", string[i]); } printf("\n"); return 0; }
内容的提问来源于stack exchange,提问作者Colby Williams
相关产品推荐
相关产品推荐

