gpt4 book ai didi

c - 为什么这不消除 C 中的双空格?这是 K & R 中的 getchar() 练习之一

转载 作者:太空宇宙 更新时间:2023-11-04 06:03:19 26 4
gpt4 key购买 nike

这是一个 K&R 练习。它应该用一个空格代替双倍或更多。相反,它完全反射(reflect)了输入、空格和所有内容。另外,为什么我必须在其他练习中使用 EOF (ctrl-d) 而在这个练习中使用 RETURN (Enter)? (我在 Ubuntu 上运行它,但在 Mac 上使用 ssh。)

 #include <stdio.h>

main()
{

int c;

c = getchar();

while (c != EOF)
{
while (c != EOF | c != ' ')
{
putchar(c);
c = getchar();
}
putchar(c);
c = getchar();
while (c == ' ' | c != EOF)
c = getchar();
}

最佳答案

显示的片段有[至少]一个逻辑错误和另一个错误,这是由于逻辑 bool 运算符和按位 bool 运算符之间的混淆造成的。

逻辑错误:

您对 c != EOF 的第二个测试与对字符不是空格的测试进行 OR 运算 (c != ' ')...由于当 c 不是 EOF 时(这是 while 的控制条件),您会进行此 OR-ed 测试,因此 OR-ed 测试始终为真!

   ...
while (c != EOF)
{
// This test always true regardless of c being a space or not
// Also it should be a logical OR, if at all. The bitwise OR will produce
// odd results if you are not sure of the bit patterns of the operands.
while (c != EOF | c != ' ')
{
putchar(c);
c = getchar();
}
...

操作错误的混淆:在这种情况下,您需要分别使用逻辑 OR(或者实际上是逻辑 AND)运算符,即 ||&&,而不是按位 bool 运算符(|&)。

您通常会发现,在 C 语言中,您经常使用逻辑运算符来表达 bool 条件,因此只有在您实际上需要处理变量的位模式时才需要按位运算符(例如,屏蔽某些位或强制它们被设置等)

现在,上面的内容是“按原样”解决代码中的问题,只是解释了为什么像处理其他字符一样处理空格……关于 K&R 练习的目标:用一个空格替换多个空格的序列空间,所显示的逻辑肯定是错误的。我不想在这里泄露它,但有一些提示:

  • 引入一个“状态”变量,指示前一个字符是否为空格
  • 使用单个 while 循环(而不是 EOF 或您希望的任何结束条件)
  • 在循环内系统地输出读取的字符,除非设置了状态变量
  • 有条件地输出当前字符后,更新状态字符。

作为一般提示,当您需要重复结束时,它通常(但不总是)“code smell”(即代码/逻辑应该重新设计的指示) -循环中的循环条件和/或引入您从某些输入读取的多个点(此处为多个 getchar())

关于c - 为什么这不消除 C 中的双空格?这是 K & R 中的 getchar() 练习之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15287680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com