You need to enable JavaScript to run this app. C语言如何用scanf读取用户输入生成字符串?正确获取字符串长度的方法
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 03:06:04