[英]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部分是语句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循环旨在允许第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 loop
的start 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
。 scanf
结果,这是严重的错误。 scanf
返回成功转换的项目数,如果输入不匹配,则为零; 或EOF和I / O错误的负数。 对一个正确的程序进行测试至关重要。 在您的情况下,格式错误的输入或I / O错误可能会使word
永久保持不变; 您的循环条件将永远不会为假,并且程序将在无限循环中被调用。 scanf
不会超出word
的范围编写,以防输入的单词长于9个字符。 这是通过最大字段长度实现的。 这里的简单解决方案不能从逻辑角度正确处理此类输入格式错误(下一个scanf
将读取上次迭代中遗留的太长单词的一部分),而仅仅是一种技术保护。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.