当前位置: 首页 > news >正文

scanf 读取字符串

在C++中,scanf 是C语言标准库函数,不能直接读取 std::string 类型,因为它设计用于处理C风格字符串(char*)。若要使用 scanf 读取字符串,需按以下方式处理:

一、使用 scanf 读取C风格字符串(char[]

1. 基础用法
#include <cstdio>int main() {char str[100];scanf("%s", str);  // 读取字符串,遇空格或换行停止printf("%s\n", str);return 0;
}
2. 安全风险:缓冲区溢出

若输入超过数组长度,会导致溢出。安全写法

char str[10];
scanf("%9s", str);  // 最多读取9个字符,预留1个位置给'\0'

二、scanf 读取含空格的字符串

1. 使用扫描集(%[
char str[100];
scanf("%99[^\n]", str);  // 读取直到换行符,最多99个字符
getchar();  // 消耗掉缓冲区的换行符
2. 示例:读取整行
#include <cstdio>int main() {char str[100];scanf("%99[^\n]", str);  // 读取整行(含空格)printf("读取的内容:%s\n", str);return 0;
}

三、将C风格字符串转为 std::string

若需要 std::string 类型,可在读取后转换:

#include <cstdio>
#include <string>int main() {char buffer[100];scanf("%99s", buffer);  // 读取到C风格字符串std::string str(buffer);  // 转换为std::stringprintf("C风格字符串:%s\n", buffer);printf("std::string:%s\n", str.c_str());return 0;
}

四、为什么 scanf 不能直接读取 std::string

  1. 类型不匹配scanf 是C语言函数,不认识C++的 std::string
  2. 内存管理std::string 需动态分配内存,而 scanf 只能操作预先分配的C数组。

五、C++推荐:使用 std::cingetline

1. 读取不含空格的字符串
#include <iostream>
#include <string>int main() {std::string str;std::cin >> str;  // 遇空格停止std::cout << str << std::endl;return 0;
}
2. 读取含空格的整行
#include <iostream>
#include <string>int main() {std::string line;std::getline(std::cin, line);  // 读取整行std::cout << line << std::endl;return 0;
}

六、总结

需求推荐方法示例代码
读取不含空格的字符串scanf + C风格字符串char str[100]; scanf("%99s", str);
读取含空格的字符串scanf + 扫描集scanf("%99[^\n]", str);
直接使用 std::stringstd::cingetlinestd::string s; std::getline(cin, s);

建议:在C++中优先使用 std::cingetline,它们更安全且直接支持 std::string。仅在性能敏感或兼容C代码时使用 scanf

http://www.xdnf.cn/news/1035109.html

相关文章:

  • 本地密码生成管理工具,自定义生成密码
  • Vue3组件生成唯一标识符方法
  • 16.vue.js watch()和watchEffect()的对比?(追踪依赖)(3)
  • 华为OD机考-货币单位换算-字符串(JAVA 2025B卷)
  • CMake 构建系统概述
  • LeetCode - 153. 寻找旋转排序数组中的最小值
  • Hive SQL执行流程深度解析:从CLI入口到执行计划生成
  • 计网复习知识(16)传输层及其协议功能
  • 贝塞尔曲线:优雅的数学艺术
  • C# 解析 URL URI 中的参数
  • OpenWrt | 解决NTFS格式的硬盘意外断电之后无法再次挂载的问题
  • 轻量免安装 透明背景图标一键提取,系统文件图标随取随用
  • NGINX 四层共享内存区同步模块实战 `ngx_stream_zone_sync_module`
  • qml显示svg矢量图形
  • FreeRTOS的低功耗Tickless模式
  • RLHF调参实战手册:实用Trick、现象排查与解决思路(持续更新)
  • 动态BGP服务器的用途都有什么?
  • Softhub软件下载站实战开发(二):项目基础框架搭建
  • 萌系盲盒陷维权风暴,Dreams委托David律所已立案,速避雷
  • 历史数据分析——贵州茅台
  • LeetCode[106]从中序和后序遍历序列构造二叉树
  • Sngine 4.0.4海外社交平台PHP源码 – 多语言支持短视频和博客订阅(源码下载)
  • [学习] 多项滤波器在信号插值和抽取中的应用:原理、实现与仿真(完整仿真代码)
  • 使用Three.js创建炫酷的3D玻璃质感动态效果
  • 大小端的区别
  • MiniCPM4端侧AI模型
  • 机器学习算法_支持向量机
  • 图数据库(TuGraph)
  • DataX 框架学习笔记
  • GDI 区域检测与边框宽度的关系