- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想做的事情:
我想要一个将名称存储到 char*
数组中的代码
我打算使用 cin.getline 和 cin.clear 来进行输入错误安全。
规则是:它必须存储最多 10 个名称或在输入 .
后中断。
在这两种情况下,名称都必须放在 cout 上,每行 1 个名称。
我的循环应该做什么:接受最多 MAX_NAME_LEN 个字母,并且在下一个循环开始之前,应该将超出最大长度的所有内容从标准输入中丢弃。
do
{
cin.getline(szInputRef, MAX_NAME_LEN);
sizeLastLen = cin.gcount();
szpNames[sizeIndex] = new char[sizeLastLen];
strncpy (szpNames[sizeIndex], szInputRef, sizeLastLen);
szpNames[sizeIndex][sizeLastLen] = '\0';
sizeIndex++;
cin.clear();
}
while ((sizeIndex < 10) &&(szpNames[sizeIndex - 1][0] != '.'));
for (sizeIndex = 0; sizeIndex < 10; sizeIndex++)
{
if (szpNames[sizeIndex][0] == '.')
{
break;
}
cout << szpNames[sizeIndex] << endl;
}
但实际上发生了什么:扩展了 MAX_NAME_LEN 个字母数的输入在没有检查的情况下被用作下一个输入。所以假设我们说测试用例 MAX_NAME_LEN 是 3
并输入:
ig
se
nols
输出将是:
ig
se
nol
s
如果输入是 > (MAX_NAME_LEN * 2)该应用程序崩溃至于第二个输入检查似乎没有出现。所以在阅读完 cin.clear() 的文档之后
我不明白为什么输入在调用 cin.clear() 之后还存在并被保存。如果没有 cin.getline 检查,甚至不会存储任何扩展输入行为的 Clou,因此应用程序可能会崩溃。
谁能解释一下我理解错了什么或者我的代码中有什么逻辑错误?
最佳答案
丢弃输入流中的所有内容通常不是一件有用的事情。例如,有人可能会向您提供一个文件到标准输入,在这种情况下,您会丢弃所有内容,或者您的操作系统可能会以不同于您预期的方式缓冲,并且您最终会得到不可预测的结果。您真正想要做的是忽略当前输入行的其余部分。最简单的方法是说
#include <iostream>
#include <limits>
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
在哪里std::numeric_limits<std::streamsize>::max()
是std::streamsize
中最大的数字std::istream::ignore
的类型和特例它意味着无限。这意味着:忽略无限多个字符或到下一个 '\n'
, 以先到者为准。
但是,您不能无条件地执行此操作,因为 std::istream::getline
如果缓冲区足够大,则使用换行符;你会忽略每一行。仅当该行太长而无法放入缓冲区时才必须执行它。发生这种情况时,std::istream::getline
套failbit
, 所以我们最终得到
if(std::cin.fail()) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
顺便说一句,您还应该防范不可恢复的 I/O 错误和文件结束等“错误”。目前,如果有人在您的程序运行时按 Ctrl+D (Unix) 或 Ctrl+Z (Windows),它会做一些有趣的事情。当然,如果你使用 std::string
就容易多了。和 std::getline
.
关于c++ - cin.clear() 的意外行为;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27099638/
我想创建一个基于 jQuery 的非常简单的 html 编辑器(不是所见即所得)。 我的问题是如何制作 textarea或 div可能 在上面写一些文字 然后样式即标签(例如 some stuff 将
根据文档 isset 条款“测试此项目中是否已设置给定属性”。我不明白设置属性时 isset 返回 true 还是 false 在下面的代码片段中,当 env.JAVA_HOME 未设置时,java.
我正在尝试取消映射 o这是执行 :only 的默认命令( :help :only ),所以我尝试的第一件事是: nmap o 这种作品,除非我按 ,等待超过timeoutlen ms 然后按 o
我有以下型号: class MetaData(models.Model): created_at = models.DateTimeField(auto_now_add=True, auto_
下面列出了两行代码。两者对日期和时间的期望相同,但只有一个有效。我正在使用 R 3.1。 以下不起作用: DateTime2=strftime("08/13/2010 05:26:24.350", f
我有一个关于 C 代码的问题。 #include void foo(void){ int a; printf("%d\n",a); } void bar(void){
如果文件大小 > 8k,为什么读取的最后一个字节 = 0? private static final int GAP_SIZE = 8 * 1024; public static void main(
我有一个命令 Get-Testdata从不同来源检索测试数据并将这些数据存储到 PSObject以不同的值作为属性。然后将对象总数存储为数组,以便于操作、排序、计算等。 我的问题是我希望能够将这些数据
我正在使用 epoll 将大消息写入使用 HTTP 协议(protocol)的服务器。 fds 都设置为非阻塞,我正在使用边缘触发事件。我知道对于 EPOLLIN,我需要循环读取 fd,直到返回 EA
这对我来说听起来很奇怪: $test_1 = 'string'; $test_2 = '0'; var_dump(intval($test_1)); // Output: int 0 var_dump
这个问题在这里已经有了答案: Java: Integer equals vs. == (7 个回答) 7年前关闭。 请您解释以下行为。 public class EqAndRef { publ
Drupal 的行为到底是什么? 它为模块开发人员提供什么类型的服务层? 它映射到 jQuery.ready 的关系类型是什么? 最佳答案 长版:Drupal.behaviors 不仅仅是 jQuer
以下代码: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ for (int i=0
人们可以将项目添加到数据库中。我让他们选择在此时添加它,或手动选择日期。 因此我得到了这个 HTML 结构。 (请注意,我将日期和时间选择器妥协为只有一行文本) Selec
创建了一个数据框: simpleDF is.na(simpleDF$vals) [1] TRUE TRUE FALSE > is.nan(simpleDF$vals) [1] FALSE TRU
我有一个大的 docker 镜像 A,我创建了一个新的 Dockerfile FROM A RUN rm /big-folder 我尝试使用以下方法构建图像: docker build --squas
我想知道以下情况下 JVM 的行为是什么: JVM 最小堆大小 = 500MB JVM 最大堆大小 = 2GB 操作系统有 1GB 内存 JVM启动后,程序运行一段时间后,使用内存超过1GB。我想知道
我们正在使用 spikeearrest 策略,但我们不了解其工作原理。峰值逮捕配置如下: 5pm 阅读文档,我们了解到,如果我们在一分钟内调用此流超过 5 次,则该策略将在第 5 次之后
我正在使用 cURL 发送 POST 请求: curl http://tarvos.local:8080/partial_Users/2 -d '{currentPage : 1, firstID :
我的表中有 6442670 条记录,我正在使用以下命令获取它们jdbctemplate 使用行号一次 1000000 个。以下是查询 select * from (select rowNum rn
我是一名优秀的程序员,十分优秀!