如以下代码所述,我不了解scanf
循环中for
的使用情况。
我使用它时如何使用或使用它?
#include<stdio.h>
int main() {
char word[10];
int count[10] = {0};
printf("Enter text:\n");
for(scanf("%s", word); word[0] != '.'; scanf("%s", word)) {
int len;
for(len = 0; word[len] != '\0'; len++);
count[len]++;
}
int i;
for(i = 1; i < 10; i++) {
printf("There are %d words with %d letters\n", count[i], i);
}
答案 0 :(得分:2)
通常,for循环具有以下结构:
for (part1; part2; part3) {
....
}
所以这里,第1部分是语句scanf("%s", word);
,这意味着你最初在进入循环之前读取了一个字符串。每次迭代后,检查条件,第3部分再次是语句scanf("%s", word);
。因此,在每次迭代后,您都会读取一个新字符串(然后在您的条件中使用它)。
实际上,这个循环相当于
scanf("%s", word);
while(word[0] != '.')
{
int len;
for(len = 0; word[len] != '\0'; len++);
count[len]++;
scanf("%s", word);
}
答案 1 :(得分:1)
for
循环有三个部分。第一部分总是先执行,而不再执行。这样做
for(scanf("%s", word); word[0] != '.'; scanf("%s", word)) {
基本等同于
scanf ("%s", word);
for(; word[0] != '.'; scanf("%s", word)) {
如果您不了解for
循环的工作原理,请参阅流程图:
(Source)
如果您需要教程,请参阅this tutorial on loops。
答案 2 :(得分:1)
这是一个相当丑陋的循环。因为for循环被设计为允许在第1和第3子句中的任何形式的表达,所以它起作用。这并不意味着你应该编写这样的代码。
循环等同于:
scanf("%s", word);
while(word[0] != '.')
{
...
scanf("%s", word);
}
我建议您改用while
。
答案 3 :(得分:0)
通常for.. loop
就是这样:for(DO_ONCE_WHEN_THE_LOOP_STARTS; CONDITION_TO_CONTINUE ; DO_AT_END_OF_EACH_ITERATION) {STATEMENTS;}
。
在上面的代码中,scanf("%s",word)
在start of the loop
和end of every iteration of the loop
处执行。
答案 4 :(得分:0)
for(scanf("%s", word); word[0] != '.'; scanf("%s", word))
{
int len;
for(len = 0; word[len] != '\0'; len++);
count[len]++;
}
for loop
的语法是for(initialization;condition;increments/decrements)
scanf()
中的正在接受用户的输入并在word as a string
然后检查条件word[0]
是.
是否scanf()
然后再次以增量scanf()
在运行时读取新字符串
因此for() loop
中使用的for(scanf("%s", word); word[0] != '.'; scanf("%s", word))
是在运行时读取输入
答案 5 :(得分:0)
我可以从你的for循环理解
$t = 0;
foreach ($activos as $key => $value) {
foreach ($pagos as $key1 => $value1) {
if($value == $key1){
$t += $value1;
}
}
}
你要输入字符串并计算单词和字母的数量,直到'。'作为字符串的第一个字符给出。
这个for循环没有错,因为在获取每个字符串后,你正在检查'。'并按照它计算。
可能不是正确的编码方式,但可以适用于这种情况。
答案 6 :(得分:0)
在循环语句中直接使用复杂的函数调用并不常见,因为它可能会影响可读性。 (简单函数调用的一个例子是K&amp; R着名的while((c = getchar()) != EOF)
。)
那就是说,我更喜欢while循环中的scanf
,并测试执行有意义的循环操作所需的两个条件:
while( scanf("%9s", word) > 0 && word[0] != '.') {/* use word */}
快捷&&
运算符测试第二个条件(此处:word[0] != '.'
仅当第一个条件为真时。word
仅在scanf
可以读取时进行测试东西。
使用while循环可以清楚地表明我们正在测试条件并避免重复scanf
表达式。
关于您的原始代码:
for
循环在测试中具有scanf
(在每次迭代之前执行,包括第一次迭代),则scanf
循环不必重复scanf
。scanf
结果未在您的代码中进行测试,这是非常糟糕的。 word
返回成功转换的项目数,如果输入不匹配,则可能为零;或EOF和I / O错误的负数。正确的程序必须对此进行测试。在您的情况下,格式错误的输入或I / O错误可能会使scanf
永久保持不变;你的循环条件永远不会是假的,程序将在无限循环中调用。word
不会超出scanf
的范围。这是通过最大字段长度实现的。这里的简单解决方案无法从逻辑角度正确处理此类输入格式错误(下一个{{1}}将读取上一次迭代中留下的太长字的部分),但这只是技术保护。 / LI>