Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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_Windows_For Loop - Fatal编程技术网

C 我输入"&引用;作为完成代码的第一个输入,但输出是另一个

C 我输入"&引用;作为完成代码的第一个输入,但输出是另一个,c,windows,for-loop,C,Windows,For Loop,我知道这是一个愚蠢的问题,但我不知道这里发生了什么…如果你删除最后一个循环,问题就会解决。它只发生在“.”是第一个输入时…为什么 #include <stdio.h> #include <conio.h> int main() { long int fact; int i=1, num, num0,per; char end; for(num0=0; (end=getchar())!=46; num0++){ pri

我知道这是一个愚蠢的问题,但我不知道这里发生了什么…如果你删除最后一个循环,问题就会解决。它只发生在“.”是第一个输入时…为什么

#include <stdio.h>
#include <conio.h>
int main()
{   
    long int fact;
    int i=1, num, num0,per;
    char end;
    for(num0=0; (end=getchar())!=46; num0++){ 
        printf("\nEnter a number:");
        scanf("%d",&num);
        fact=1;
        for(; i<=num; i++){
            fact*=i;
            fact+=1;
            fact+=num;
            printf("Ok done");
        }
        printf("The factorial is:%ld",fact);//*
        printf("Hi");
    }
        for(per=0; per<=10 ;per++)//*
        printf("per");//*

    printf("Finish\n");
    getch(); 
    return 0;
}
输出:

 Ok doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneOk doneThe factorial is:-1271807075HiperperperperperperperperperperperFinish

这是一个更干净的版本。如果在提示输入数字时输入“s”,程序将退出。如果您输入任何其他内容,它将推进其计算。请注意,您的阶乘是错误的,但我留下它是因为我不确定您要计算什么

#include <stdio.h>
#include <conio.h>
int main()
{   
    long int fact = 0;
    int num = 0;
    char stop;

    while(1) {
        printf("\nEnter s to quit, any other char to continue\n");
        scanf("%c", &stop);
        if(stop == 's') {
            printf("Finish\n");
            return 0;
        } else {
            printf("\nEnter a number: ");
            scanf("%d", &num);
            
            fact = 1;
            for(int i = num; i > 0; i--){
                fact *= i;
                fact += 1;
                fact += num;
            }
            printf("\nThe factorial is: %ld \n", fact);
        }
    }

    return 0;
}
#包括
#包括
int main()
{   
长整型事实=0;
int num=0;
煤焦停止;
而(1){
printf(“\n输入s以退出,任何其他字符以继续\n”);
scanf(“%c”,停止(&S);
如果(停止=='s'){
printf(“Finish\n”);
返回0;
}否则{
printf(“\n输入一个数字:”);
scanf(“%d”和&num);
事实=1;
对于(int i=num;i>0;i--){
事实*=i;
事实+=1;
事实+=num;
}
printf(“\n阶乘为:%ld\n”,事实);
}
}
返回0;
}
编辑:


问题之一是使用未初始化的
num
,当您输入一个句点时,
scanf
不会拾取它。因此,单元化的
num
中保留了一些垃圾值,从而提供了意想不到的输出。由于某种原因,当您将“per”循环保留为out时,num被初始化为0。因此,您的程序不会进入循环,因为
i
大于
num
。这纯粹是巧合。循环之间的连接是变量的初始化。

似乎有一个从输入字符到ascii码的转换(46,在“.”的情况下)

可能问题在于您的算法和“长”数字(例如46)溢出。尝试使用其他数据类型保存更长的数字



更新 在C语言中,scanf不会将字符自动转换为ascii码,因此,由于您没有在预期的位置键入数字作为输入,因此会从num中获取“垃圾”值(一个长数字)。相反,尝试在声明num时将其初始化为-1(仅仅因为数学上,(-1!)不存在)

int main ()
{
  long int fact;
  int num = -1;
  char end;

  for (int num0 = 0; (end = getchar ()) != 46; num0++)
    {
      printf ("\nEnter a number:");
      scanf ("%d", &num);

      fact = num >= 0 ? 1 : 0; // 0 is a good value to a non valid entry for the factorial, as the factorial of valid entries will never be 0

      // If the factorial was zero, then the factorials for all number will be the same,
      // something which is impossible.
      if (fact > 0)
        {
          for (int i = 1; i <= num; i++)
            {
              fact *= i;
              fact += 1;
              fact += num;
              printf ("Ok done");
            }

          printf ("The factorial is: %ld", fact);   //*
        }
    
      printf ("Hi");
    }


    for (int per = 0; per <= 10; per++) //*
      printf ("per");       //*


    printf ("Finish\n");
    getch ();
    return 0;
}
int main()
{
长期事实;
int num=-1;
焦端;
for(int num0=0;(end=getchar())!=46;num0++)
{
printf(“\n输入一个数字:”);
scanf(“%d”和&num);
fact=num>=0?1:0;//0对于阶乘的无效项是一个好值,因为有效项的阶乘永远不会是0
//如果阶乘为零,那么所有数字的阶乘都是相同的,
//不可能的事。
如果(事实>0)
{

对于(int i=1;i,您的实际错误位于此行:

       scanf("%d", &num);
如果scanf遇到的是“.”而不是整数,它将失败,使num未赋值。在您的情况下,num被分配了一个随机值,这似乎与代码的其余部分不同。(未定义的行为)

通过检查scanf的返回值替换scanf行,修改代码以处理scanf不解析任何输入的情况:

        if (scanf("%d", &num) <= 0) /* invalid input */
            continue; /* Or perhaps "break" if you want to cancel on this condition */

<代码> >(Snf)(“%d”,num)如果输入一个句号(“。”),我得到“PaPrPaPaPiPaPiPrPulfRead”作为输出。另外,这是什么:<代码>事实+= 1;事实++num;< /Cord>?@ nxp5z,您应该输入第二个输入……我首先说,因为我认为第一个是当代码进入循环并要求您“输入一个数字”时。…这只是一个公式如果你在得到输出后输入
输入一个数字,你的输入将被
scanf
解析,它将无法读取一个整数。你应该检查
scanf
的返回值。很抱歉我的代码不清楚,但我只想知道为什么我的输出是这样的,以及为什么我删除了最后一个循环会正常工作。我无法理解它们之间的关系。我已经解决了你的问题-循环之间的关系是初始化。你还有其他问题吗?问题已经解决,但我仍然想知道“某些原因”是什么是。您知道我了解更多的资源吗?谢谢您的帮助。如果您感兴趣,我强烈建议您在程序运行(即调试)时查看程序中的值。对于像这样的简单程序,我建议使用OnlineGDB,这样你就可以在windows上轻松使用它。至于初始化:AFAIK,你得到的单位化变量的值也可以用魔术来解释;我认为它不会遵循任何可预测的模式。永远不要对这些变量做任何假设。你能在问题中指定“.”是为getchar()键入的吗?我完全理解您的答案,但我不确定垃圾值及其工作原理!请看这个
        if (scanf("%d", &num) <= 0) /* invalid input */
            continue; /* Or perhaps "break" if you want to cancel on this condition */