printf()中的scanf()如何工作?

时间:2018-06-12 17:23:29

标签: c printf scanf

#include<stdio.h>
int main(){

        int n;
        printf("%d\n",scanf("%d",&n));
        return 0;
}

我想知道为什么这个程序的输出总是'1'? 这里到底发生了什么?

11 个答案:

答案 0 :(得分:4)

我怀疑你想用

int n;
scanf("%d", &n);
printf("%d\n", n);

但你所写的相当于

int n;
int num = scanf("%d", &n); // num is the number of successful reads.
printf("%d\n", num);

答案 1 :(得分:2)

该程序与

完全等效
#include <stdio.h>

int main() {
    int n;
    int r = scanf("%d", &n);
    printf("%d\n", r);
    return 0;
}

因此,如果您运行此程序,并且键入(比方说)45,那么scanf将读取45,并将其分配给n,并返回1以告知您已执行此操作。该程序打印scanf返回的值1( 读取的数字scanf!)。

尝试运行程序并输入“A”。在这种情况下,scanf应该返回,你的程序应该打印,0。

最后,如果可以的话,尝试运行程序并根本不给它任何输入。如果您使用的是Unix,Mac或Linux,请在运行程序后立即键入control-D(即不输入任何其他内容),或者在重定向的输入下运行它:

myprog < /dev/null

在Windows上,您可以键入control-Z(可能后跟Return键)以生成文件结束条件。在任何这些情况下,scanf都应该返回,并且您的程序应该打印,-1。

答案 2 :(得分:1)

在您的计划中scanf成功返回1,scanf成功将某个值转换为n,这就是您printf("%d\n",scanf("%d",&n));始终获得1的原因。 你应该修改你的代码,如下面的

#include<stdio.h>
int main(){

        int n;
        scanf("%d",&n);
        printf("%d\n",n);
        return 0;
}

答案 3 :(得分:1)

man scanf

  

返回值

     

这些函数返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。

在你的程序中,它只匹配1个输入,所以如果你输入一个可以匹配scanf的合法值,函数%d将返回1,否则它将返回0。

在您的情况下,您可能始终满足此要求,因此总是返回1.

答案 4 :(得分:1)

scanf返回成功转化的次数。 尝试将scanf更改为如下所示.... 输入两个有效整数后,您会注意到打印2。

int n1 =0;
int n2 =0;
int i = scanf("%d %d",&n1,&n2);

答案 5 :(得分:1)

@jishnu ,好的问题以及您获得的输出也是正确的,因为您只从标准输入(stdin)读取一个值。

  

scanf()读取标准输入提供的值,并返回从标准输入(键盘)成功读取的值的数量。

     

在C中,printf()返回成功写入输出的字符数,scanf()返回成功读取的项目数。访问https://www.geeksforgeeks.org/g-fact-10/并详细了解它。

查看以下2个代码示例。

  

http://rextester.com/HNJE76121在线试用以下代码。       // clang 3.8.0

#include<stdio.h>
int main(){

    int n, n2;
    printf("%d\n",scanf("%d%d",&n, &n2));   //2
    return 0;
}

在您的代码中,scanf()仅从键盘中读取1个值(stdin),这就是输出为1的原因。

//clang 3.8.0

#include<stdio.h>
int main(){

    int n;
    printf("%d\n",scanf("%d",&n));   //1
    return 0;
}

答案 6 :(得分:1)

gsub返回成功转换和分配的次数。在您的情况下,您只扫描一个参数,因此scanf将成功返回scanf匹配失败时返回1 (其中第一个非空白输入字符不是十进制数字),或者在文件结尾或错误时0

当您致电EOF时,其每个参数都已评估,结果将传递给该函数。在这种情况下,评估涉及调用printf函数。然后scanf返回的值将传递给scanf

它与写作基本相同

printf

对于咯咯笑,看看当你输入int count = scanf( "%d", &n ); printf( "%d\n", count ); 或输入 Ctrl D (或 Ctrl Z <时会发生什么/ kbd>在Windows上。)

注意abc 返回一个值(写入流的字节数),所以你可以写一些荒谬的 1 之类的

printf

<小时/>

  1. 笑话。不要这样做。

答案 7 :(得分:1)

df[, year:=year(date) ][, avg_5yrs := sapply(1:.N, function(..I) mean(pop[year < year[..I] & year >= year[..I] -6])), by=month(date) ][, year:=NULL][] date pop avg_5yrs 1: 1967-07-01 198712.0 NaN 2: 1967-08-01 198911.0 NaN 3: 1967-09-01 199113.0 NaN 4: 1967-10-01 199311.0 NaN 5: 1967-11-01 199498.0 NaN --- 570: 2014-12-01 319746.2 311845.5 571: 2015-01-01 319928.6 312028.1 572: 2015-02-01 320074.5 312192.6 573: 2015-03-01 320230.8 312357.4 574: 2015-04-01 320402.3 312498.1 编程中,C从键盘的scanf()获取输入,并返回成功读取的输入数 并且stdin()返回写入显示监视器printf()的字符数。

在您的程序中,stdout()仅读取一个返回的输入,并由scanf()打印。因此,无论输入是什么,输出都将始终为1,因为它只能读取一个输入。

这里介绍一下这个C程序:

printf()

它接受输入或使用#include<stdio.h> int main(){ int n, n2; printf("%d\n",scanf("%d %d",&n,&n2)); return 0; } stdin()读取两个整数,因此输出始终为2。

** 注意:如果您的输入不是整数,则输出为0,因为它仅读取整数。

答案 8 :(得分:0)

scanf()的文档说返回值为:

Number of receiving arguments successfully assigned (which may be zero in case a matching failure occurred before the first receiving argument was assigned), or EOF if input failure occurs before the first receiving argument was assigned.

您想要的代码是:

#include<stdio.h>
int main(){

    int n;
    scanf("%d",&n);
    printf("%d\n",scanf("%d",&n));
    return 0;
}

答案 9 :(得分:0)

如果您使用此代码作为示例, 它显示:警告:隐含的功能声明&gt; printf&#39; [-Wimplicit-function declaration]

int main()
{
char b[40]; 
printf(" %d", scanf("%s", b));
getchar();
} 

返回值:-1

printf scanf 等功能的输出可用作其他功能的参数。

答案 10 :(得分:0)

scanf()是一个整数返回类型函数。它返回其中的转换字符总数。例如,如果语句写为:

int c;
c=scanf("%d %d %d");
printf("%d",c);

然后该程序的输出将为3。 这是因为scanf()是整数返回类型函数,它不返回转换字符总数,因此,作为3转换字符,它将把3返回到c。 因此,在您的代码中,scanf()1返回到printf(),因此程序的输出为1。 这是因为如果在printf()中使用了多个语句,则执行顺序从右到左开始。 因此,首先执行scanf(),然后执行printf()