关于C++代码中cin.get()链式调用里get(c)作用的技术问询
搞懂
cin.get(...).get(c)里get(c)的作用 嘿,我来给你掰扯清楚这个问题——你现在看到的get(c)其实是在帮你“清理残局”,虽然当前场景下去掉它程序好像也能跑,但它的存在是为了让代码更严谨,避免后续踩坑。
先拆解这段代码的执行逻辑:
- 第一个
cin.get(straddress, sizeof(straddress), fdelim):它会从输入里读取字符,直到碰到你指定的分隔符fdelim(这里是制表符' ')、或者缓冲区满了、或者到了输入末尾。重点:这个操作不会把那个分隔符从输入缓冲区里拿走,它会留在那儿。 - 后面的
.get(c):就是专门把刚才留在缓冲区里的那个分隔符取出来,存到变量c里(哪怕你之后不用这个c也没关系)。 - 最后才是
>> zip读取整数。
那为什么你去掉get(c)程序还能正常运行?
因为你用的分隔符是制表符,属于C++里的“空白字符”,而>>操作符读取整数时,默认会自动跳过开头的所有空白(空格、制表符、换行符都算)。所以即使缓冲区里留着那个制表符,>> zip也会直接忽略它,去读后面的数字,看起来就像没影响一样。
但get(c)的价值远不止于此,它是为了应对更通用的场景:
- 要是你把分隔符改成非空白字符(比如逗号
','),那>> zip就不会跳过它了——它会尝试把逗号当成整数的一部分,直接导致读取失败,整个输入流的状态会变成错误,后续所有输入操作都会罢工。这时候get(c)就必须存在,把那个逗号从缓冲区里清走,让>> zip能正常读数字。 - 就算现在用的是空白分隔符,要是后续的输入操作不是
>>(比如用另一个get读取字符串,而且不跳过空白),那残留的制表符就会被读进新的字符串里,直接打乱你的逻辑。
举个等价的代码写法,你可能更容易理解:
// 链式调用拆成三步,效果完全一样 cin.get(straddress, sizeof(straddress), fdelim); cin.get(c); // 把分隔符从缓冲区里拿出来 cin >> zip;
所以总结一下:get(c)的核心作用是手动清除输入缓冲区中残留的分隔符,保证后续输入操作的正确性。当前场景下它看似多余,只是因为刚好撞上了>>自动跳过空白的特性,但从代码健壮性的角度来说,保留它是更稳妥的做法。
内容的提问来源于stack exchange,提问作者MarionaGlenni
相关产品推荐
相关产品推荐

