【问题标题】:Iteration (filtering out specific letters) using getchar in C在 C 中使用 getchar 进行迭代(过滤掉特定字母)
【发布时间】:2017-03-11 15:05:59
【问题描述】:

我是 C 新手,我编写了以下代码:

for(i=0; i<25; ++i) {
    ch=getchar();
    if (ch == 'A' || ch == 'B'|| ch == 'C'|| ch == 'D'|| ch == 'a'|| ch == 'b'|| ch == 'c'|| ch == 'd'){
    putchar(toupper(ch));
    }
}

我希望我的代码过滤掉字母“a、b、c 和 d”,并将它们显示为输出当且仅当有一个可以与 B 配对的 A(B 相同)和 C 可以与D配对。(大写输出)

我为此使用了 for 循环,以便每次进入循环时都会获取字母。

我不希望我的代码包含数组。

示例输入和预期输出:

输入:ATASHPPOTCBD
输出:ACBD

它写入第一个 A 是因为它能够与 B 配对,但不能与第二个 A 配对。它还写入 C 和 D,因为它们能够配对。

【问题讨论】:

  • 您能否编辑您的问题 以显示一些示例输入以及预期(和实际)输出?
  • @Someprogrammerdude 添加,感谢您的反馈!
  • 所以如果我理解正确的话,当你找到第一个 'A' 时,你会搜索第一个 'B',当你找到第二个 'A' 时,你会搜索可能的第二个 'B' .如果第二个'A' 没有匹配的第二个'B',则不会打印'A'。那是对的吗?如果是这样,您不能只使用单个循环来执行此操作,您需要嵌套循环来搜索'B'。并且您需要跟踪您当前拥有的'A'(第一、第二、第三等),以知道要找到哪个'B'
  • 没错,你做对了。我打算使用嵌套循环,但我很难尝试建立算法,因为我无法找到第一个 A 并寻找第一个 B。
  • 您的问题仍然没有明确说明。似乎您应该忽略并且不打印除 A、B、C 或 D(或其小写对应项)之外的任何字符。目前尚不清楚您是否必须准备好处理千兆字节文件或仅处理单行,以及单行可能有多长。看来您必须记录有趣的字母序列,以便确定如何打印它们。您提到“B 相同”,但不清楚这意味着什么。 “BADC”的输出应该是什么? 'AAAAAAAABCCCCDDDDDDDDDDDDDCC 的输出应该是什么?猜测:'ABCCCCDDDD'?

标签: c for-loop iteration


【解决方案1】:

一些显示可能算法的简单伪代码:

read_all_input_into_a_string();

current_A = 0;

for(each character in the string)
{
    if (character == 'A')
    {
        ++current_A;
        current_B = 0;
        for (each character2 in the string)
        {
            if (character2 == 'B')
            {
                ++current_B;
                if (current_A == current_B)
                {
                    // Found matching A and B
                }
            }
        }
    }
}

如果在搜索匹配的'B' 时不应该从字符串的开头重新开始,那么只需从找到'A' 的位置开始。

【讨论】:

  • 有没有办法在不将输入保存在内存中的情况下做到这一点?喜欢,不使用字符串?
  • @Stekker 如果文件很大,或者您的内存非常有限,那么您可以在找到'A' 时保存文件位置,然后在搜索'B' 后返回该位置位置。而不是迭代字符串中的字符,您当然可以从文件中读取字符。保存到字符串中会比在文件中来回跳转更有效。
猜你喜欢
  • 2014-08-15
  • 2017-10-04
  • 2012-11-03
  • 2015-01-07
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 2022-01-06
相关资源
最近更新 更多