我的 For 循环计数器没有按预期增加
My For loop counter is not increasing as expected
我正在尝试将函数输入字符串的第 j
个值替换为 '0'
,只要字母表的第 i
个值包含在函数的输入中。
我希望这个 for 循环在 alphabet[i]
等于输入 x[j]
时递增 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
这是我的第一个 post 如果我过于冗长或没有遵守任何未说明的规则,请原谅我;当我做出更多贡献时,我很乐意提供任何建议。
我可能是错的,但看起来 "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 - 你对作业的解释
replace the 'j'th
value of the function's input string to '0'
whenever the 'i'th
value of alphabet is contained in the function's input.
在这里,您将 whenever 解释为 "update input string with '0' for **ALL** matches"
即用 0's
.
替换所有 A's
如果我遵循解释 [2] 那么 你的函数代码的输出“按原样” for 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
打开此 link 以查看 C 中的工作代码
https://onlinegdb.com/rJhda-gMP
3 - 你对作业的解释
I am expecting this for-loop to increment the 'i'
whenever the alphabet[i]
equals input x[j]
在这里,您将 whenever 解释为“一旦找到第一个匹配项,就用 '0'
更新输入字符串并递增 'i'
”
ASSUMING 解释 [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
打开此 link 以查看 C 中的工作代码
https://onlinegdb.com/rJhda-gMP
希望对您有所帮助。
首先,printf("%c,", alphabet[i]);
是一个错误。您可能不想在 %c
之后使用 ,
。删除它。
其次,嵌套循环中的逻辑很容易松散,尤其是作为初学者。把它写在纸上并 运行 通过它,如果你还没有了解调试器。
现在,当 alphabet[i]
和 x[j]
之间存在匹配时,您可能不希望 i
到 ++
,因为 i
是您的循环柜台,不应该被那样搞砸(你可能混淆了 for
循环和 while
循环或者来自 Scratch 之类的东西)。
我建议为这个任务声明一个单独的变量,比如 int x
。
正如评论中已经提到的那样,您实际上并没有实现这种增量(在 if 语句中使用简单的 x++;
),并且错误地假设 i++
在你的 for 循环中已经为你完成了。
再次,我建议你去看看书,然后回去看看 for 循环的确切工作原理,它 非常 在 C 中经常使用,所以你 不能对其关键概念模糊不清。
此外,您似乎希望字符串 x
保留 0AA
...如果是这种情况,为什么 first 语句你 if()
是 x[j] = '0';
吗?这将使 x
中与 alphabets
匹配的 每个 j
个元素变为 '0'
.
此外,在 预期输出 中,您预期 alphabet[i]
是 A
,然后是 B
,然后是 C
,尽管在你的问题中明确指出你已经将 x
作为 "AAA"
传递(这显然不能与 B
或 C
匹配)。
也许你还没有写清楚'我希望'。如果您在问题中提供的代码不可能,请不要包含示例预期输出。它让我感到困惑,也可能让任何人感到困惑。我假设您大大缩短了 S.O 的代码。但提供了您计算机上某处的原始代码的预期输出。
我正在尝试将函数输入字符串的第 j
个值替换为 '0'
,只要字母表的第 i
个值包含在函数的输入中。
我希望这个 for 循环在 alphabet[i]
等于输入 x[j]
时递增 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
这是我的第一个 post 如果我过于冗长或没有遵守任何未说明的规则,请原谅我;当我做出更多贡献时,我很乐意提供任何建议。
我可能是错的,但看起来 "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 - 你对作业的解释
replace the
'j'th
value of the function's input string to'0'
whenever the'i'th
value of alphabet is contained in the function's input.
在这里,您将 whenever 解释为 "update input string with '0' for **ALL** matches"
即用 0's
.
A's
如果我遵循解释 [2] 那么 你的函数代码的输出“按原样” for 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
打开此 link 以查看 C 中的工作代码
https://onlinegdb.com/rJhda-gMP
3 - 你对作业的解释
I am expecting this for-loop to increment the
'i'
whenever thealphabet[i]
equals inputx[j]
在这里,您将 whenever 解释为“一旦找到第一个匹配项,就用 '0'
更新输入字符串并递增 'i'
”
ASSUMING 解释 [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
打开此 link 以查看 C 中的工作代码
https://onlinegdb.com/rJhda-gMP
希望对您有所帮助。
首先,printf("%c,", alphabet[i]);
是一个错误。您可能不想在 %c
之后使用 ,
。删除它。
其次,嵌套循环中的逻辑很容易松散,尤其是作为初学者。把它写在纸上并 运行 通过它,如果你还没有了解调试器。
现在,当 alphabet[i]
和 x[j]
之间存在匹配时,您可能不希望 i
到 ++
,因为 i
是您的循环柜台,不应该被那样搞砸(你可能混淆了 for
循环和 while
循环或者来自 Scratch 之类的东西)。
我建议为这个任务声明一个单独的变量,比如 int x
。
正如评论中已经提到的那样,您实际上并没有实现这种增量(在 if 语句中使用简单的 x++;
),并且错误地假设 i++
在你的 for 循环中已经为你完成了。
再次,我建议你去看看书,然后回去看看 for 循环的确切工作原理,它 非常 在 C 中经常使用,所以你 不能对其关键概念模糊不清。
此外,您似乎希望字符串 x
保留 0AA
...如果是这种情况,为什么 first 语句你 if()
是 x[j] = '0';
吗?这将使 x
中与 alphabets
匹配的 每个 j
个元素变为 '0'
.
此外,在 预期输出 中,您预期 alphabet[i]
是 A
,然后是 B
,然后是 C
,尽管在你的问题中明确指出你已经将 x
作为 "AAA"
传递(这显然不能与 B
或 C
匹配)。
也许你还没有写清楚'我希望'。如果您在问题中提供的代码不可能,请不要包含示例预期输出。它让我感到困惑,也可能让任何人感到困惑。我假设您大大缩短了 S.O 的代码。但提供了您计算机上某处的原始代码的预期输出。