繁体   English   中英

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

[英]How to use scanf in for loop as a condition in c programming language

如以下代码所示,我不了解for循环中scanf用法。

如何使用或使用它时会做什么?

#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);
}

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

for (part1; part2; part3) {
    ....
}
  • 第1部分在循环开始之前执行一次的语句。 执行之后,您进入循环,并且其语句开始执行。 这部分主要用于对循环有用的初始化。 如果将其保留为空,则在循环之前根本不执行任何操作。
  • 第2部分您在每次迭代中检查条件
  • 第三部分在每次迭代结束时执行的语句。

因此,这里的第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);
}

for循环分为三个部分。 第一部分总是首先执行,而不再执行。 这样做

for(scanf("%s", word); word[0] != '.'; scanf("%s", word)) {

基本上相当于

scanf ("%s", word);
for(; word[0] != '.'; scanf("%s", word)) {

如果您不了解for循环的工作原理,请参见流程图:

在此处输入图片说明

来源

如果您需要教程,请参阅本教程

那是一个相当丑陋的循环。 由于for循环旨在允许第1和第3子句中的任何形式的表达式,因此它可以工作。 但这并不意味着您应该像那样编写代码。

该循环等效于:

scanf("%s", word);
while(word[0] != '.')
{
  ...
  scanf("%s", word);
}

我会建议你使用while代替。

通常的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 loopstart of the loop end of every iteration of the loop

    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()循环中的scanf()将用户的输入和word as a string

  • 然后检查条件是否为word[0]. 或不

  • 然后以增量scanf()再次在运行时读取新字符串

所以在for() loop使用的scanf()是在运行时读取输入

从您的for循环中我可以理解的是

for(scanf("%s", word); word[0] != '.'; scanf("%s", word))

您将输入字符串并计算单词和字母的数量,直到'。'。 被指定为字符串的第一个字符。

在此for循环中没什么问题,因为在获取每个字符串之后,您将使用“。”进行检查。 并据此计算。

可能不是正确的编码方式,但可以解决这种情况。

在循环语句中直接使用复杂的函数调用并不常见,因为这可能会损害可读性。 (一个简单的函数调用示例是K&R着名的while((c = getchar()) != EOF) 。)

也就是说,我希望在while循环中使用scanf ,并测试执行有意义的循环操作所需的两个条件:

while( scanf("%9s", word) > 0 && word[0] != '.') {/* use word */}

&&运算符仅在第一个条件为true时才测试第二个条件(这里: word[0] != '.' 。此处仅在scanf可以读取某些内容的情况下测试word

使用while循环可以清楚地表明我们正在测试条件,并且避免了重复scanf表达式。

关于原始代码:

  • 如果for循环在测试中具有scanf (在每次迭代(包括第一个迭代)之前执行),则不必重复scanf
  • 在那种情况下,for循环的初始化部分为空,这有时表明人们可以使用while循环,就像我在这里一样。
  • 在您的代码中未测试scanf结果,这是严重的错误。 scanf返回成功转换的项目数,如果输入不匹配,则为零; 或EOF和I / O错误的负数。 对一个正确的程序进行测试至关重要。 在您的情况下,格式错误的输入或I / O错误可能会使word永久保持不变; 您的循环条件将永远不会为假,并且程序将在无限循环中被调用。
  • Lundin正确地指出,健壮的代码还必须确保scanf不会超出word的范围编写,以防输入的单词长于9个字符。 这是通过最大字段长度实现的。 这里的简单解决方案不能从逻辑角度正确处理此类输入格式错误(下一个scanf将读取上次迭代中遗留的太长单词的一部分),而仅仅是一种技术保护。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM