如何使用scanf for for循环作为c编程语言的条件

时间:2016-03-17 10:00:02

标签: c loops scanf

如以下代码所述,我不了解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);
}

7 个答案:

答案 0 :(得分:2)

通常,for循环具有以下结构:

for (part1; part2; part3) {
    ....
}
  • 第1部分是在循环开始之前执行一次的语句。执行完成后,您将进入循环并开始执行其语句。该部分主要用于对循环有用的初始化。如果你把它留空,你就不会在循环之前做任何动作。
  • 第2部分是您在每次迭代时检查的条件
  • 第3部分是在每次迭代结束时e xecuted的声明

所以这里,第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循环的工作原理,请参阅流程图:

enter image description here

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 loopend 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)

    for循环中代码中的第一个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
  • 在这种情况下,for循环的初始化部分为空,这有时表明可以使用while循环,就像我在这里一样。
  • scanf结果未在您的代码中进行测试,这是非常糟糕的。 word返回成功转换的项目数,如果输入不匹配,则可能为零;或EOF和I / O错误的负数。正确的程序必须对此进行测试。在您的情况下,格式错误的输入或I / O错误可能会使scanf永久保持不变;你的循环条件永远不会是假的,程序将在无限循环中调用。
  • Lundin正确指出,如果输入字长于9个字符,强健代码还必须确保word不会超出scanf的范围。这是通过最大字段长度实现的。这里的简单解决方案无法从逻辑角度正确处理此类输入格式错误(下一个{{1}}将读取上一次迭代中留下的太长字的部分),但这只是技术保护。 / LI>