输出以C显示不必要的数字
我正在编写一个程序,要求用户输入日期,当用户输入0/0/0作为日期时,程序停止要求用户输入日期,但我对输出有问题,下面是代码:输出以C显示不必要的数字,c,for-loop,output,C,For Loop,Output,我正在编写一个程序,要求用户输入日期,当用户输入0/0/0作为日期时,程序停止要求用户输入日期,但我对输出有问题,下面是代码: #include <stdio.h> #include <stdlib.h> int main (){ int d, m, y; for (;d!=0 && m!=0 && y!= 0;){ printf("Enter a date (xx/xx/xxxx): "); scanf(&
#include <stdio.h>
#include <stdlib.h>
int main (){
int d, m, y;
for (;d!=0 && m!=0 && y!= 0;){
printf("Enter a date (xx/xx/xxxx): ");
scanf("%d/%d/%d", &d, &m, &y);
}
return 0;
}
正如您看到的输出一样,问题是在每一个换行上,最大的数字显示在每一个换行上,不管它是属于d、m还是y变量这是为什么?我如何修复它?首先,您的循环访问
d
、m
、y
,即使它们没有收到初始值。这是未定义的行为。你是说intd=1,m=0,y=0
至于额外的迭代,程序只是按照您的要求执行。虽然这些变量不是零,但需要更多的输入。你输入3/3/3,所以变量不是零,所以它要求更多的输入
我在上面设置d=1
,以便第一次进入循环;如果我们将变量全部初始化为零,循环将不会执行
如果我们从循环顶部测试切换到循环底部,我们可以处理未初始化的变量
在C中执行循环底部测试的方法之一是使用do
/while
循环:
do {
// ask for input
} while (d != 0 && m != 0 && y != 0); // unless zeros were given, ask again
do
的一个问题是,终止表达式的作用域中没有任何内部变量,因此,例如,这个习惯用法是不可能的:
do {
int x = some_function();
// ...
} while (x != 0); // x is not in scope here!
这可能是do
循环没有像for
和while
那样被广泛使用的原因之一。在这种情况下,我们可以为(;;)创建一个无限循环,然后作为一个if
插入循环底部测试,并加一个中断:
for (;;) {
int x = some_function();
// ...
if (x == 0) // note inversion: while (x != 0) -> if (x == 0)
break;
// nothing else here, hence "bottom-of-loop test"
}
最后,我不鼓励您使用scanf
进行交互式输入。如果用户在输入语法中犯了任何错误,scanf
不提供错误恢复scanf
适用于处理特定程序中的数据文件,这些文件应该是正确的。使用scanf
时,应捕获其返回值并对其执行操作:它指示成功进行了多少次转换,如果未进行转换,则可能返回负值EOF
为了以一种更健壮的方式获得交互式输入,我们可以使用fgets
从用户处读取行,使用一个大的缓冲区大小。然后,使用scanf
的字符串版本扫描缓冲区的内容,即sscanf
(还截取sscanf
的返回值并对其进行操作以提供错误诊断和恢复)
还请注意,如果我们调用scanf(“%m”,&m)
,但没有成功转换(例如scanf
返回0或EOF
),则在这种情况下m
保留其先前的值。如果m
未初始化,则它将保持未初始化状态。如果不检查scanf的结果,程序将使用旧值,认为它们是新值
正如您可以看到的输出
我可以看到输出,但在产生输出的程序中没有任何内容。希望这些提示能有所帮助。当我运行代码时,它会立即终止,可能是因为程序启动时,
d
、m
和y
的值碰巧为零。当我将程序更改为使用特定标志来指示循环的第一次通过时(我将循环更改为而循环,因为这就是实际发生的情况),我没有收到您报告的问题:
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int d, m, y, first = 1;
while(first || (d!=0 && m!=0 && y!= 0))
{
first = 0;
printf("Enter a date (xx/xx/xxxx): ");
scanf("%d/%d/%d", &d, &m, &y);
}
return 0;
}
您的代码根本不会打印输出。您是否向我们展示了您的实际代码?一个如何使代码过于复杂的示例。为什么不简单:
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int d, m, y, first = 1;
while(first || (d!=0 && m!=0 && y!= 0))
{
first = 0;
printf("Enter a date (xx/xx/xxxx): ");
scanf("%d/%d/%d", &d, &m, &y);
}
return 0;
}
Enter a date (xx/xx/xxxx): 1/2/3
Enter a date (xx/xx/xxxx): 4/5/6
Enter a date (xx/xx/xxxx): 7/8/9
Enter a date (xx/xx/xxxx): 0/0/0