C++输入流详解:从cin>>到getline,彻底解决带空格字符串读取问题
1. 项目概述一个看似简单却暗藏玄机的问题在C编程的日常练习和项目开发中处理用户输入是最基础的操作之一。很多初学者甚至一些有一定经验的开发者都曾在这个看似简单的环节上栽过跟头。其中最经典、最让人头疼的“大坑”之一就是如何正确地输入一个包含空格的字符串。你可能已经习惯了使用cin str;来读取输入但当用户输入“Hello World”时程序却只接收到了“Hello”后面的“World”不翼而飞或者留在了输入缓冲区导致后续的输入读取直接出错。这个问题频繁出现在处理人名、地址、句子或者任何需要完整文本的场景中是C输入流机制给新手上的第一堂“实践课”。这个问题的核心源于C标准输入流cin与提取运算符的默认行为它们以空白字符空格、制表符、换行符作为分隔符。因此当cin str遇到第一个空格时它就认为当前字段的输入结束了将空格之前的内容存入变量而空格及之后的内容则留在了输入缓冲区中。这不仅仅是“带空格的字符串”输入问题更是理解C输入输出流、缓冲区管理以及字符串处理的一个绝佳切入点。解决它意味着你需要从“流”的概念出发掌握几种不同的工具和方法并理解它们各自的适用场景与陷阱。接下来我们就彻底拆解这个“大坑”看看如何优雅地填平它。2. 核心需求解析为什么cin 不行要解决问题首先得明白问题产生的根源。cin是istream类的一个对象而是定义在istream中的提取运算符。它的设计初衷是为了方便读取格式化的输入比如整数、浮点数、单个单词。这种设计在读取以空白分隔的数据时非常高效。2.1cin 的默认行为与缓冲区原理当你执行cin variable;时其内部逻辑大致如下跳过前导空白运算符默认会跳过输入缓冲区开头所有的空白字符isspace函数返回true的字符包括空格 、换行\n、制表\t等直到遇到第一个非空白字符。这通常是你想要的因为它避免了前一个输入留下的换行符干扰。读取直到下一个空白从第一个非空白字符开始持续读取字符并存储到变量中直到再次遇到空白字符。此时读取停止这个遇到的空白字符不会被消耗它仍然留在输入缓冲区中。类型转换与存储将已读取的字符序列根据变量类型进行转换如转换成int、double然后存入变量。对于string类型的变量第2步中读取的字符序列被直接存入字符串。问题就出在第2步的停止条件上。例如#include iostream #include string using namespace std; int main() { string name; cout 请输入您的全名: ; cin name; // 用户输入John Doe[回车] cout 您输入的名字是: name endl; return 0; }输出将是您输入的名字是: John“Doe”和后面的换行符都留在了缓冲区里。如果接下来还有一次cin 操作它会直接读取“Doe”这往往不是程序预期的行为。2.2 忽略空格带来的连锁问题这个行为的副作用不仅限于丢失部分输入。考虑一个需要连续读取多个字段的场景int age; string city; cout 请输入年龄和城市: ; cin age city; // 用户输入25 New York[回车]这里cin age会成功读取25然后cin city会读取紧随其后的“New”而“York”又留在了缓冲区。城市名被截断程序逻辑完全错误。注意这是一个非常典型的错误在编写需要交互式输入的程序时如果不处理空格程序行为会变得极其诡异且难以调试。它暴露的是对输入流“状态”和“缓冲区内容”缺乏管理。因此我们的核心需求非常明确我们需要一种方法能够读取一行输入并将其完整地包括其中的空格存储到一个字符串变量中直到遇到行结束符通常是回车换行。同时理想的方法还应该能妥善处理输入缓冲区避免残留字符影响后续的输入操作。3. 解决方案全景四种主流方法深度对比填平这个“坑”有多种工具每种都有其特定的使用方式和注意事项。没有绝对的“最佳”只有“最适合”当前场景的。下面我们将详细解析四种最常用的方法std::getline、cin.get()、cin.getline()以及如何安全地混合使用cin 和getline。3.1 首选方案std::getline全局函数这是C标准库中为读取整行文本而生的函数也是解决此问题最推荐、最现代的方法。它定义在string头文件中。函数原型istream getline (istream is, string str, char delim); istream getline (istream is, string str); // 常用形式默认分隔符为 \nis输入流对象如cin。str用于存储读取内容的string对象。delim分隔符遇到此字符停止读取。默认是换行符\n。关键特性读取整行它会读取从当前流位置开始的所有字符直到遇到分隔符默认是\n。消耗分隔符与cin 不同getline会读取并丢弃遇到的分隔符。也就是说换行符被从缓冲区移除了不会影响下一次输入。存储到std::string直接与std::string配合无需担心字符数组的大小内存自动管理。基本用法#include iostream #include string using namespace std; int main() { string fullSentence; cout 请输入一句话: ; getline(cin, fullSentence); // 读取整行包括空格 cout 你说的是: \ fullSentence \ endl; // 可以指定其他分隔符 string data; cout 请输入以逗号分隔的数据 (如 a,b,c): ; getline(cin, data, ,); // 遇到逗号停止逗号被消耗 cout 第一个字段是: data endl; // 此时缓冲区可能还有剩余内容如 “b,c”需要后续处理 return 0; }实操心得getline是处理用户输入、读取文本文件行的首选工具。它的行为最符合“读取一行”的直觉。当分隔符不是换行符时需要特别注意缓冲区里可能还残留着未读的内容可能需要循环读取或结合istringstream进行二次解析。如果输入流在调用getline前已经处于错误状态如eofgetline会立即失败str的内容不会被修改。好的实践是在读取后检查流状态if (!getline(cin, str)) { /* 处理错误 */ }。3.2 传统C风格方案cin.getline()成员函数这是istream类的成员函数在C引入string类之前常与字符数组C风格字符串一起使用。函数原型istream getline (char* s, streamsize n, char delim); istream getline (char* s, streamsize n); // 默认分隔符 \ns指向字符数组的指针用于存储结果。n最多读取的字符数包括结尾自动添加的空字符\0。如果设为100则最多读取99个有效字符。delim分隔符。关键特性读取到字符数组必须预先分配足够大的固定大小数组存在缓冲区溢出的风险。消耗分隔符和全局的getline一样会读取并丢弃分隔符。溢出处理如果输入的字符数不包括分隔符达到或超过n-1它会设置流的失败标志failbit并停止读取。这可能导致后续所有输入操作失效需要调用cin.clear()来清除错误状态并可能需要忽略缓冲区中剩余的、超长的字符。基本用法与风险#include iostream using namespace std; int main() { const int BUFFER_SIZE 100; char buffer[BUFFER_SIZE]; cout 请输入一行文本: ; cin.getline(buffer, BUFFER_SIZE); // 安全地读取最多99个字符 cout 输入的内容是: buffer endl; // 危险示例缓冲区太小 char smallBuf[10]; cout 请再输入一行: ; cin.getline(smallBuf, 10); // 用户输入超过9个字符就会导致失败 if (cin.fail()) { cout 输入过长已截断或导致错误 endl; cin.clear(); // 必须清除错误状态 cin.ignore(numeric_limitsstreamsize::max(), \n); // 忽略缓冲区剩余内容 } return 0; }注意事项内存安全是首要问题。必须确保数组大小足够并理解n的含义。在现代C中除非有极特殊的性能要求或兼容性限制否则应优先使用std::getline配合std::string彻底避免缓冲区溢出。一旦发生溢出failbit被设置必须立即处理否则程序后续的输入逻辑会全部混乱。处理流程通常是cin.clear()cin.ignore(...)。3.3 字符级控制方案cin.get()cin.get()是一个更底层的函数用于读取单个字符或一系列字符。它有几个重载版本可以用来“手动”构建读取一行的逻辑。常用重载int get();读取一个字符返回其整数值通常是ASCII码遇到文件尾返回EOF。istream get (char c);读取一个字符到c中。istream get (char* s, streamsize n, char delim);与cin.getline()非常相似但关键区别在于它不消耗分隔符。使用cin.get(char*, n, delim)读取一行#include iostream using namespace std; int main() { const int SIZE 100; char buffer[SIZE]; cout 请输入: ; cin.get(buffer, SIZE, \n); // 读取直到换行符但不消耗换行符 cout 缓冲区内容: \ buffer \ endl; // 检查下一个字符是不是换行符 char nextChar cin.get(); // 这里会读取到那个未被消耗的换行符 if (nextChar \n) { cout 确认换行符还在已被本次get()读取。 endl; } return 0; }关键区别与陷阱cin.get(buffer, n, delim)在遇到分隔符时停止读取但分隔符仍然保留在输入缓冲区中。这是它与getline系列函数最本质的区别。这意味着如果你在调用它之后立刻又调用一次cin.get(buffer, ...)或cin 会因为缓冲区第一个字符是分隔符而立即停止读取到一个空字符串。实操心得除非你需要非常精细地控制每一个字符的读取例如解析特定格式的协议否则不推荐使用cin.get(char*, n, delim)来读取行因为遗留的分隔符是常见的错误来源。cin.get()读取单个字符的功能在某些场景下有用比如“按任意键继续”cout 按Enter键继续...; cin.get(); // 等待用户按下一个字符通常是回车3.4 混合输入的“天坑”与填平方法cin 后接getline这是实际编程中最容易踩坑的场景。当你需要先读一个数字再读一行字符串时问题就出现了。问题复现#include iostream #include string using namespace std; int main() { int age; string name; cout 请输入您的年龄: ; cin age; // 用户输入30[回车] // 此时缓冲区内容\n cout 请输入您的姓名: ; getline(cin, name); // 遇到缓冲区里的 \n立即停止读取到空字符串 cout 年龄: age , 姓名:\ name \ endl; // 姓名为空 return 0; }原因cin age读取了数字30但留下了用户按下的回车符\n在缓冲区。紧接着的getline(cin, name)一上来就遇到了这个\n于是它认为“这一行已经结束了”因为\n是默认分隔符所以它读取了一个空字符串并消耗掉了这个\n。标准解决方案清空缓冲区在cin 之后、getline之前手动清除缓冲区中残留的换行符。#include iostream #include string #include limits // 需要用到 numeric_limits using namespace std; int main() { int age; string name; cout 请输入您的年龄: ; cin age; // 关键步骤清除输入缓冲区中残留的换行符或其他字符 cin.ignore(numeric_limitsstreamsize::max(), \n); // 这行代码的作用忽略提取并丢弃缓冲区中从当前位置开始直到遇到换行符为止的所有字符。 // numeric_limitsstreamsize::max() 是一个非常大的数确保能忽略掉所有字符直到换行符。 cout 请输入您的姓名: ; getline(cin, name); // 现在可以正常读取整行了 cout 年龄: age , 姓名:\ name \ endl; return 0; }cin.ignore()详解原型istream ignore (streamsize n 1, int delim EOF);作用从流中提取并丢弃字符直到丢弃了n个字符或者遇到了分隔符delim该分隔符也会被丢弃。常用写法cin.ignore(numeric_limitsstreamsize::max(), \n);numeric_limitsstreamsize::max()代表streamsize类型能表示的最大值这是一个“足够大”的数确保能忽略一整行。\n分隔符表示忽略直到换行符包括它自己。重要提示在编写需要混合输入类型的程序时养成在cin 后立即跟一句cin.ignore(...)的习惯可以避免绝大多数因缓冲区残留导致的诡异问题。这是处理C控制台输入时一个非常重要的“防御性编程”技巧。4. 方案选型与实战场景指南了解了所有工具后我们该如何选择下表总结了四种方法的核心区别与适用场景特性/方法std::getline(cin, string)cin.getline(char*, n)cin.get(char*, n)cin ignoregetline目标类型std::stringchar数组 (C风格字符串)char数组 (C风格字符串)混合类型内存管理自动安全手动有溢出风险手动有溢出风险混合处理分隔符读取并丢弃读取并丢弃读取但不丢弃需手动处理主要用途读取整行文本的现代首选读取行到固定缓冲区传统/兼容C精细控制字符读取或需要保留分隔符先读格式化数据如int再读整行文本易错点流状态错误时失败缓冲区溢出导致流失败残留分隔符影响后续输入忘记ignore()导致getline读空推荐指数★★★★★★★☆☆☆★★☆☆☆ (特定场景)★★★★☆ (混合输入时)实战场景建议纯字符串输入需要完整一行无脑选择std::getline(cin, myString)。这是99%情况下的最佳选择。读取文本文件同样使用std::getline(ifstream, myString)。需要兼容老旧代码或特定库要求C风格字符串谨慎使用cin.getline(buffer, size)务必确保size足够大并做好错误检查。解析复杂格式例如数据格式是数字,字符串,数字。可以先用std::getline(cin, line)读取整行然后用std::istringstream iss(line);结合iss num comma str ...进行二次解析这样更安全清晰。混合输入如“年龄姓名”“数量物品列表”采用“格式化读取 ignore 行读取”模式。int count; cin count; cin.ignore(numeric_limitsstreamsize::max(), \n); // 清除数字后的换行 vectorstring items(count); for (int i 0; i count; i) { getline(cin, items[i]); // 安全读取每一行 }5. 高级话题与边界情况处理掌握了基本方法后我们还需要关注一些边界情况和进阶用法以确保程序的健壮性。5.1 处理输入错误与流状态输入操作可能失败例如用户输入了非数字字符而你用cin int去读或者到达了文件末尾。流对象有状态标志位good()一切正常。eof()到达文件尾。fail()发生了格式错误如期望数字却收到字母但流未损坏。bad()发生了严重的流错误如磁盘读写失败。健壮的输入循环示例#include iostream #include string using namespace std; int main() { int age; string name; cout 请输入年龄: ; while (!(cin age)) { // 如果读取int失败 cout 输入错误请重新输入一个整数: ; cin.clear(); // 清除错误状态如failbit cin.ignore(numeric_limitsstreamsize::max(), \n); // 清空错误输入 } // 成功读取age后清除后面的换行符 cin.ignore(numeric_limitsstreamsize::max(), \n); cout 请输入姓名: ; while (getline(cin, name) name.empty()) { // 防止用户直接按回车输入空名字 cout 姓名不能为空请重新输入: ; } cout 信息录入成功。 endl; return 0; }5.2 处理超长输入cin.getline的failbit当使用cin.getline(buffer, n)且用户输入超过n-1个字符时流会进入失败状态。你必须处理它char buf[10]; cin.getline(buf, 10); if (cin.fail()) { if (!cin.eof()) { // 不是因为文件结束而是因为输入太长 cout 警告输入超过缓冲区长度已截断。 endl; cin.clear(); // 清除failbit cin.ignore(numeric_limitsstreamsize::max(), \n); // 忽略这行剩余内容 } } // 此时buf中只有前9个有效字符\0再次强调使用std::string和std::getline可以完全避免这个烦恼。5.3 自定义分隔符与复杂解析getline的第三个参数允许你指定任意分隔符。这在解析CSV逗号分隔值或特定格式的数据时非常有用。string csvLine Apple,Red,Round,Sweet; istringstream ss(csvLine); string token; while (getline(ss, token, ,)) { cout 字段: token endl; } // 输出 // 字段: Apple // 字段: Red // 字段: Round // 字段: Sweet注意如果字段内部可能包含分隔符如引号包裹的字符串则需要更复杂的解析逻辑这通常需要手动实现或使用专门的库。5.4 性能考量与std::ios::sync_with_stdio(false)默认情况下C的iostream与C的stdio是同步的以确保混合使用cin/cout和scanf/printf时顺序不会错乱。但这会带来一些性能开销。在只使用iostream且对输入输出性能有极高要求的场景如算法竞赛可以在main函数开头加入int main() { ios::sync_with_stdio(false); cin.tie(nullptr); // 解绑 cin 和 cout可进一步提升速度 // ... 你的代码 }这样做之后cin/cout会使用独立的缓冲区速度更快。但副作用是你不能再混用scanf/printf和cin/cout它们的输出顺序将无法保证。同时getline等操作依然正常工作。对于绝大多数应用开发不需要关心这个优化。6. 总结与最佳实践清单回顾整个“大坑”其本质是对C输入流缓冲区和不同读取函数行为差异的不理解。要成为一名能稳健处理输入的C程序员请牢记以下最佳实践首选std::getline(std::cin, std::string)这是读取包含空格字符串最安全、最现代的方式。它自动管理内存消耗分隔符行为符合直觉。警惕混合输入只要程序中使用cin 读取了格式化数据整数、浮点数、单个单词在接下来使用getline读取整行之前务必使用cin.ignore(numeric_limitsstreamsize::max(), \n);清空缓冲区中的残留换行符。避免使用C风格字符串数组除非有强制性的兼容性要求否则不要使用cin.getline(char*, n)。使用std::string可以彻底杜绝缓冲区溢出风险。理解get与getline的关键区别cin.get(char*, n)不消耗分隔符而getline系列函数消耗分隔符。这个区别是许多隐蔽bug的根源。编写健壮的输入代码重要的输入操作应该放在循环中检查流状态cin.fail(),cin.eof()并在失败时清除错误状态和无效输入。根据场景选择工具读整行文本 -std::getline读格式化数据 -cin 混合读取 -cin ignorestd::getline精细字符控制 -cin.get()最后我个人在实际项目中的体会是输入处理是程序与用户交互的门面它的健壮性直接决定了用户体验。花时间处理好这些细节尤其是处理好cin 和getline混用时的缓冲区问题能省去后期大量的调试时间。一个简单的ignore()调用往往是区分一段“能用”的代码和一段“健壮”的代码的关键。下次当你需要读取带空格的字符串时希望你能自信地绕过这个“大坑”。

相关新闻

SIMULINK模型自动生成Verilog代码:从算法到硬件的全流程实践

SIMULINK模型自动生成Verilog代码:从算法到硬件的全流程实践

1. 项目概述:从模型到芯片的桥梁 在数字电路和嵌入式系统开发领域,一个长期存在的痛点是如何将高层次的算法模型高效、准确地转化为底层的硬件描述语言(HDL)代码。传统的手工编写Verilog或VHDL代码,不仅耗时费力&#…

2026/7/29 4:35:01 阅读更多 →
嵌入式开发内存管理:堆栈、Flash、RAM与程序段深度解析

嵌入式开发内存管理:堆栈、Flash、RAM与程序段深度解析

1. 从一段编译错误说起:为什么理解内存布局至关重要如果你写过C/C程序,尤其是嵌入式或资源受限环境的代码,大概率见过类似“堆空间不足”或“section.data’ will not fit in regionRAM’”这样的链接错误。最近在调试一个STM32项目时&#x…

2026/7/29 4:35:01 阅读更多 →
A2B总线技术:汽车音频系统低延迟、低成本数字传输方案详解

A2B总线技术:汽车音频系统低延迟、低成本数字传输方案详解

1. 项目概述:为什么A2B总线是汽车音频系统的“游戏规则改变者” 如果你最近几年接触过汽车电子,尤其是车载音频和通信系统,那你大概率听过A2B(Automotive Audio Bus)这个名字。它不像CAN、LIN或FlexRay那样是汽车网络的…

2026/7/29 4:35:01 阅读更多 →

最新新闻

六自由度机器人逆运动学:从D-H建模到Matlab代码实现

六自由度机器人逆运动学:从D-H建模到Matlab代码实现

1. 项目概述:从“正”到“逆”的机器人控制核心搞机器人,无论是工业机械臂还是服务机器人,运动学都是绕不开的坎。正运动学好理解,你给我各个关节的角度,我就能算出末端执行器在空间中的精确位姿。但实际工作中&#x…

2026/7/29 4:41:03 阅读更多 →
51单片机入门实战:Keil+Proteus流水灯开发全流程详解

51单片机入门实战:Keil+Proteus流水灯开发全流程详解

1. 项目缘起:从“点灯”开始的单片机世界如果你刚拿到一块51单片机开发板,或者正准备开始学习嵌入式开发,那么第一个要征服的“小怪兽”,十有八九就是流水灯。这几乎是所有单片机学习者的“Hello World”。它看似简单,…

2026/7/29 4:41:03 阅读更多 →
HC32F460移植RT-Thread Nano:从裸机到实时操作系统的实践指南

HC32F460移植RT-Thread Nano:从裸机到实时操作系统的实践指南

1. 项目概述:为什么要在HC32F460上跑RT-Thread Nano? 如果你手头正好有华大半导体的HC32F460这块高性能MCU,又厌倦了裸机编程里那些繁琐的状态机和时间片轮询,想试试实时操作系统(RTOS)带来的清爽&#xff…

2026/7/29 4:41:03 阅读更多 →
四足机器人开发实战:从STM32控制到步态算法实现

四足机器人开发实战:从STM32控制到步态算法实现

1. 项目概述:从零开始的四足蜘蛛机器人最近在整理自己的嵌入式学习笔记,决定把之前做的一个四足蜘蛛机器人项目完整地复盘一遍。这个项目算是我从单片机裸机开发转向更复杂系统控制的一个里程碑,涉及了运动学、实时控制、多传感器融合和电源管…

2026/7/29 4:41:03 阅读更多 →
关于图论【卡码网106.海岸线计算的思考】

关于图论【卡码网106.海岸线计算的思考】

一、本题题目二、本题代码三、关键思路1、遍历图里的所有节点,遇到1的时候停下来看一眼。2、如果1周围的是越界情况或者是海洋,周长就加1。// 周长会增加的就这两种情况:1的四周是越界;1的四周是海洋四、注意事项1、注意避免惯性思…

2026/7/29 4:41:03 阅读更多 →
情感分析技术:原理、应用与Python实战

情感分析技术:原理、应用与Python实战

1. 为什么情感分析值得每个人关注?上周帮朋友分析电商评论时,我用情感分析工具5分钟就定位到了产品差评集中的功能缺陷。这种原本需要人工阅读上千条评论的工作,现在任何会打字的人都能轻松完成。这就是自然语言处理(NLP&#xff…

2026/7/29 4:40:03 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻