#include<stdio.h>
int main(){
int n;
printf("%d\n",scanf("%d",&n));
return 0;
}
我想知道为什么这个程序的输出总是'1'? 这里到底发生了什么?
答案 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)
返回值
这些函数返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。
在你的程序中,它只匹配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
<小时/>
答案 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()
。