【问题标题】:how the scanf() is executing before printf()scanf() 在 printf() 之前是如何执行的
【发布时间】:2016-06-25 10:47:53
【问题描述】:

我有以下代码来实现pow(),就像在 math.h 库中一样。 好吧,我有两个问题:

  1. 为什么 scanf() 语句在之前接受输入 它从 printf() 函数打印"power:"
  2. 如何计算大整数的幂,例如假设计算的幂是:22235645654789787978797797(仅作为示例)。我如何计算和打印它。

    #include <stdio.h>
    unsigned long long int pow(unsigned long long int n,unsigned long long int d);
    int main(){
    
    unsigned long long int a,x,n;
    printf("Number:");
    scanf("%u\n",&a);
    printf("power:");
    scanf("%u\n",&n);
    x = pow(n,a);
    printf("%u\n",x);
    }
    unsigned long long int pow(unsigned long long int n,unsigned long long int d){
    if(n+1==1)
        return 1;
    return d*pow(n-1,d);
    }
    

在图像中,您可以看到变量n 的输入在从 printf() 打印"power:" 之前获取输入,因此无论您输入什么输入。

请帮助我理解它。打开任何建议和cmets。

【问题讨论】:

  • 第一个问题已经得到解答,第二个问题你应该找到(或编写)一个 bigint 库。
  • [ this ] 回答。
  • [ this ] 问题可能重复。
  • 编译时,始终启用所有警告,然后修复这些警告。 (对于gcc,至少使用:-Wall -Wextra -pedantic 我也使用:-Wconversion -std=gnu99)然后编译器将输出有关已发布代码的一堆问题的消息。
  • 不要使用“众所周知的”系统函数名称(如pow),而是使用唯一名称(如myPow

标签: c


【解决方案1】:

您的printfs 和scanfs 按顺序执行。由于缓冲,输出看起来很乱。

"power:" 被打印时,它会在缓冲区中结束,直到输入一个数字才会被刷新。添加\n 解决了控制台输出的问题。您也可以显式调用fflush(STDOUT) 将缓冲的字符串打印到屏幕上。

注意:您没有正确阅读/打印unsigned long long。使用 llu,或查看 this Q&A 以了解 64 位无符号整数的正确格式说明符:

unit64_t a, x;
...
scanf("%"SCNu64, &a);
printf("n: %"PRIu64"\n", x);

【讨论】:

    【解决方案2】:

    你不应该使用scanf("%u\n",&amp;n),使用scanf("%u",&amp;n);而不使用\n。它将完美无缺地工作。对于第二个问题,这种计算通常在 C 编程语言中看不到。这会导致隐藏的缓冲区溢出,也许其他人会回答得比我好。

    【讨论】:

    • 你说得对,他应该使用 %llu。问题是,\n 在这里造成了麻烦。
    【解决方案3】:

    问题在于调用scanf()printf() 函数的格式字符串。

    格式字符串不应包含'\n'

    所有scanf() 格式字符串和printf() 格式字符串都使用'%u',但它们应该使用'%llu',因此它们与变量类型匹配

    注意:即使使用更正的代码,如果结果数字足够大,它会溢出'unsigned long long int'变量,程序会失败。

    这里是修正后的代码,仔细检查

    #include <stdio.h>
    #include <stdlib.h>
    
    unsigned long long int myPow(unsigned long long int n, unsigned long long int d);
    
    int main( void )
    {
        unsigned long long int a,x,n;
    
        printf("Number:");
        if( 1 != scanf("%llu",&a) )
        {
            perror( "scanf for first number failed");
            exit( EXIT_FAILURE );
        }
    
        printf("power:");
        if( 1 != scanf("%llu",&n) )
        {
            perror( "scanf for second number failed" );
            exit( EXIT_FAILURE );
        }
    
        printf( "n=%llu, a=%llu\n", n, a);
        x = myPow(n,a);
        printf("%llu\n",x);
    }
    
    unsigned long long int myPow(unsigned long long int n,unsigned long long int d)
    {
        if(n+1==1)
            return 1;
        return d*myPow(n-1,d);
    }
    

    【讨论】:

      【解决方案4】:

      我稍微修改了您的代码以正确格式化数字,并且我认为该程序现在可以执行您想要的操作。

      #include <stdio.h>
      unsigned long long int pow(unsigned long long int n,unsigned long long int d);
      int main(){
      
          unsigned long long int a,x,n;
          printf("Number:");
          scanf("%llu",&a);
          printf("power:");
          scanf("%llu",&n);
          x = pow(n,a);
          printf("%llu\n",x);
      }
      unsigned long long int pow(unsigned long long int n,unsigned long long int d){
          if(n+1==1)
              return 1;
          return d*pow(n-1,d);
      }
      

      测试

      Number:2
      power:10
      1024
      

      【讨论】:

      • 在您的示例中运行良好,但假设我采用 Number: 256 和 power: 25 这样的值,它给了我结果0我怎么不明白?
      • 256 的 8 个最低有效位等于 0。256 的平方有 16 个,256 的立方有 24 个,依此类推。所以 256 次方 25 会有这么多,它们占据了整个变量,其余的数字被截断。
      • 很好,但这并不能回答标题中提到的问题。
      猜你喜欢
      • 2021-06-23
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多