当前位置: 首页 > 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

相关文章:

  • 高压接地电阻柜组装前的准备工作
  • 容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。程序输出分油次数最少的详细操作过程。
  • 【Unity】使用 C# SerialPort 进行串口通信
  • Docker容器中运行OpenMPI并行程序, 参数调优
  • 虚拟内存优化:从原理到实战的全方位解析(工具版)
  • 静态变量详解(static variable)
  • uni-app项目实战笔记8--个人中心页面搭建
  • 现代Android开发:轻量级协程框架设计与实践
  • 设计模式汇总
  • 通达信跟老庄追涨停指标公式
  • [k8s]--exec探针详细解析
  • java 设计模式_行为型_17观察者模式
  • 如何设计幂等性接口防止Seata事务悬挂?
  • AJAX——前后端传输数据场景下使用的技术
  • 基于Docker编译运行orb-slam2_with_semantic_labelling
  • C# 枚 举(枚举)
  • [nginx]反向代理grpc
  • [技巧] 接口优化技巧合集
  • 数列求和计算
  • 人口贩卖暑期威胁消解:算法协同提升安全预警
  • 正常网站 月均ip pv/宁波网站推广
  • 免费咨询医生皮肤科专家/优化关键词软件
  • 小说网站的会员充值是怎么做的/大数据精准营销
  • 海外网站开发/武汉seo外包平台
  • 产品介绍网站如何做seo/友情链接交换
  • 税务局网站模板/新手学百度竞价要多久