Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
输出以C显示不必要的数字_C_For Loop_Output - Fatal编程技术网

输出以C显示不必要的数字

输出以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(&

我正在编写一个程序,要求用户输入日期,当用户输入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("%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