【问题标题】:My For loop counter is not increasing as expected我的 For 循环计数器没有按预期增加
【发布时间】:2020-08-11 04:48:00
【问题描述】:

只要字母表的ith 值包含在函数的输入中,我就会尝试将函数输入字符串的jth 值替换为'0'

每当alphabet[i] 等于输入x[j] 时,我希望这个for 循环增加i,但它会卡在i 上。这是怎么回事??

P.S这是一门编程入门课程(CS50),它使用的语法与标准 C 不同。

void checkrepeat(string x)
{
    string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int alphalen = strlen(alphabet);
    for (int i = 0; i < alphalen; i++)
    {
        for (int j = 0; j < strlen(x); j++)
        {
            if (alphabet[i] == x[j])
            {
                x[j] = '0';
                printf("%i,", i);
                printf("%c,", alphabet[i]);
                printf("%s\n", x);
            }
        }
    }
}

值为 x = 'AAA' 的函数的输出给了我

0,A,0AA
0,A,00A
0,A,000

我期待它给我

0,A,0AA
1,B,0AA
2,C,0AA

【问题讨论】:

  • “我希望这个 for 循环在字母表[i] 等于输入 x[j] 时增加 'i'” - 为什么?你永远不会在那种情况下增加它
  • “我希望这个 for 循环在字母表[i] 等于输入 x[j] 时增加 'i'”。你的代码没有这样做。 if (alphabet[i] == x[j]) 块不包含到 i 的任何增量。建议您使用调试器单步执行代码并在运行时观察变量值。
  • @klutt 不用于 (int i; i i++) i++ 使 'i' 增加?
  • @kaylum 也许我对 For-Loop 有一个错误的想法。我认为 for 循环中包含的任何内容都已完成,i++ 中的“i”增加了。
  • 是的,它确实增加了,但那是外循环。 j 将从 0strlen(x) 每增加一次 i 运行一次

标签: c for-loop cs50


【解决方案1】:

这是我的第一篇文章,如果我太冗长或没有遵守任何未说明的规则,请原谅我;当我贡献更多时,我很乐意提供任何建议。

我可能是错的,但看起来 "Your expected output pattern""your interpretation of assignment"矛盾的

让我解释一下为什么?

1 - x='AAA' 的预期输出

I am expecting it to give me
0,A,0AA
1,B,0AA
2,C,0AA

2 - 你对作业的解释

将函数输入字符串的'j'th值替换为'0'只要函数输入中包含字母表的'i'th值。

在这里,您将 whenever 解释为 "update input string with '0' for **ALL** matches" 即用0's替换所有A's

如果我遵循解释 [2],那么 x='AAA' 的功能代码“按原样”输出 将像这样打印

0,A,0AA
0,A,00A
0,A,000
i loop with j=1 will run but nothing is printed because there is no B in input string
i loop with j=2 will run but nothing is printed because there is no C in input string
and this will continue till Z  
and the loop will end

顺便说一句 - 我希望你能在你的解决方案中看到 CPU 处理能力的浪费。

如果您的解释 [2] 是正确的,那么您对输出 [1] 的期望是错误的,反之亦然。

假设解释 [2] 是正确的,那么您需要按如下方式更改您的代码,但是输出将与预期的输出 [1] 不同。

void checkrepeat(char x[])
{
    char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int alphalen = strlen(alphabet);

    for (int i = 0; i < alphalen; i++)
    {
        for (int j = 0; j < strlen(x); j++)
        {       
            if (alphabet[i] == x[j])
            {
                x[j] = '0';
            }
        }
        printf("%i,", i);
        printf("%c,", alphabet[i]);
        printf("%s\n", x);
    }
}

x='AAA' 的修改函数的输出会像这样打印

0,A,000
1,B,000
2,C,000
...
25,Z,000

例如,当x='ABCDZABCDZ' 时,预期的输出如下所示

0,A,0BCDZ0BCDZ
1,B,00CDZ00CDZ
2,C,000DZ000DZ
3,D,0000Z0000Z
4,E,0000Z0000Z
...
25,Z,0000000000

打开此链接以查看 C 中的工作代码

https://onlinegdb.com/rJhda-gMP

3 - 你对作业的解释

我希望这个for循环增加'i' 每当alphabet[i]等于输入x[j]

在这里,您将 whenever 解释为“一旦找到第一个匹配项,就使用'0' 更新输入字符串并增加'i'

假设解释 [3] 是正确的,需要更改以下代码以打印您的预期输出 [1]

void checkrepeat(char x[])
{
    char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int alphalen = strlen(alphabet);

    for (int i = 0; i < alphalen; i++)
    {
        for (int j = 0; j < strlen(x); j++)
        {       
            if (alphabet[i] == x[j])
            {
                x[j] = '0';
                break;       
            }
        }
        printf("%i,", i);
        printf("%c,", alphabet[i]);
        printf("%s\n", x);
    }
}

如果我遵循解释 [3],那么它符合预期的输出 [1],对于 x='AAA',您的函数将像这样打印

0,A,0AA
1,B,0AA
2,C,0AA
...
25,Z,0AA

例如,当x='ABCDZABCDZ' 时,预期的输出如下所示

0,A,0BCDZABCDZ
1,B,00CDZABCDZ
2,C,000DZABCDZ
3,D,0000ZABCDZ
4,E,0000ZABCDZ
...
25,Z,00000ABCDZ

打开此链接以查看 C 中的工作代码

https://onlinegdb.com/rJhda-gMP

希望对你有帮助。

【讨论】:

    【解决方案2】:

    首先,printf("%c,", alphabet[i]); 是一个错误。您可能不是有意在%c 之后使用,。删除它。

    其次,嵌套循环中的逻辑很容易松散,尤其是作为初学者。如果您还没有了解调试器,请将其写在纸上并通读一遍。

    现在,当 alphabet[i]x[j] 之间存在匹配时,您可能不希望 i++,因为 i 是您的循环计数器,不应该被这样弄乱(您可能将for 循环与while 循环混淆了,或者来自Scratch 之类的东西。

    我建议为此任务声明一个单独的变量,例如 int x

    正如在 cmets 中已经提到的,您实际上并没有实现这种增量(在 if 语句中使用简单的 x++;),并且错误地假设您的 for 循环中的 i++ 已经完成给你。

    再次,我建议您阅读书籍并返回以查看 for 循环的确切工作原理,该循环在 C 中非常经常使用,因此您不能 strong> 不能模糊其关键概念。

    此外,您似乎希望字符串 x 保持 0AA ... 如果是这种情况,为什么您 if() 中的 first 语句会是 x[j] = '0'; ?这将使与alphabets 匹配的x每个 jth 元素成为'0'

    此外,在 预期的输出中,尽管在您的问题中明确说明您已通过 @ 987654346@ as "AAA"(显然不能与BC 匹配)。

    也许你还没有清楚地写出'我期望'。如果您在问题中提供的代码不可能,请不要包含示例预期输出。这让我很困惑,也可能让任何人感到困惑。我假设您大大缩短了 S.O. 的代码。但提供了您计算机上某处的原始代码的预期输出。

    【讨论】:

      猜你喜欢
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      相关资源
      最近更新 更多