printf与scanf的返回值、注意点

  1. printf()的返回值为其输出字符串常量的字符数(注意字符数与字数的区别)注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符)。
  2. scanf()函数返回成功读入的项目的个数。即在下面程序中scanf的返回值为1。如果没有读取任何项目(如它期望一个数字但是出入了一个非数字字符),它会返回值0。当它检测到“文件结尾”时,它返回EOF(EOF是文件stdio.h中定义的特殊值。一般,#define 指令把EOF 的值定义为 -1)。    int n;

float  p;
    n= scanf("%f",&p);
    printf("%d,%f",n,p);

用%c读入空格和字符的问题。

如果在格式字符串中%c之前有一个空格,那么scanf()会跳到第一个非空白字符处。也就是说,命令scanf(“%c”,&ch)读取在输入中遇到的第一个字符,而scanf(“ %c”,&ch)(%c前有个空格)则读取遇到的第一个非空白字符。

     对于同时输入几个字符,如果逗号(或任何非空格字符)和第一个%c之间没有间隔,则输入时,第一个字符与逗号之间也不能有间隔;如果有空格,则输入时,第一个字符和逗号之间可以有任意多个字符,也可以是0个。如果逗号和第二个%c之间没有间隔,则逗号和第二个输入字符间也不能有间隔。如果有空格,则输入时,第二个字符和逗号之间可以有任意多个字符,也可以是0个。

printf()函数的*修饰符(*滞后赋值,例:%*d)

  假定不想事先制定字段宽度,而是希望由程序来指定该值,可以在字段宽度部分使用*来代替数字来达到目的,但是也必须使用一个参数来告诉函数字段宽度应该是什么。也就是说,如果转换说明符是%*d ,那么参数列表中应该包括一个 * 值和一个 d 的值。同时这种方式也可以和浮点数一起使用来指定精度和字段宽度。

例:

printf("What field width?\n");
        scanf("%d", &width);
        printf("The number is: %*d:\n", width, num);
        printf("Enter a width and a precision:\n");
        scanf("%d %d", &width, &precision);
        printf("Weight = %*.*f\n", width, precision, weight);

结果:

What field width?
7
The number is:     256:
Enter a width and a precision:
3 7
Weight = 123.4500000

 

  scanf()函数的*修饰符

  在scanf()函数中,当把 * 放在 % 和说明符字母之间时,它使函数跳过相应的输入项目。

例:

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

输出结果为:

2 3 5
i=2,j=5

/*
     通过while循环把上面 i 输入后的多的垃圾字符跳过
     如果没有while循环,在调试时输入 i = 123asdfg
     在Vc++6.0中的输出结果为:
     123asdfg
     i = 123
     j = -858993460
     */
    int scan1,scan2;
    char ch;
    scanf("%d", &scan1);
    printf("scan1= %d\n", scan1);
    while ( (ch=getchar()) != ‘\n‘)
        continue;
    scanf("%d", &scan2);
    printf("scan2 = %d\n", scan2);

参数传递的原理

float n1 = 3.0;
double n2 = 3.0;
long n3 = 2000000000; 
long n4 = 1234567890;  

printf("%ld, %ld, %ld, %ld\n", n1, n2, n3, n4);

结果为:

2000000000, 1234567890, 3, 64

  该调用告诉计算机把变量n1、n2、n3、n4的值传递给计算机,计算机把它们放置到被称为堆栈(stack)的一块内存区域中来实现。计算机根据变量的类型而非转换说明符把这些值放到堆栈中。所以,n1 在堆栈中占用8个字节(float 被转换成 double)。同样,n2 也占用8个字节,而n3 和n4 则分别占用4个字节。然后控制转移到 printf()函数。该函数从堆栈把值读出来,但是在读出时,它根据转换说明符去读。 %ld 说明符指出, printf() 应该读取4个字节,所以 printf()在堆栈中读取前4个字节作为它的第一个值。这就是n1的前半部分,它被解释成一个长整数。下一个 %ld说明符再读取4个字节,这就是n1 的后半部分,它被解释成第二个长整数。同样,%ld 的第三个和第四个实例使得 n2 的前半部分和后半部分被读出,并被解释成2个长整数。

时间: 2024-10-10 14:50:51

printf与scanf的返回值、注意点的相关文章

C语言scanf函数返回值小记

scanf scanf是C标准库stdio里面定义的用于获取用户输入的函数,具体的介绍可以在CppReference上看到.scanf的返回值是已经成功赋值的变量个数,也就是说在 scanf("%d %d",&a,&b)这个调用返回的值在用户输入1 2时返回的是2,如果用户输入的是1 b,那么返回值为1,如果输入的是a b,那么返回的是0. 问题 刚刚用了这个例子,发现输入字母时会导致一直无限输出0: #include <stdio.h> int main(

关于scanf的返回值

今天写一个小程序时误用while(scanf("%d",&b)!=a),以为scanf的返回值就是输入的值. 其实真相是: scanf返回接收到的变量值的个数. int a,b,c. a 1进去时,试图用字符'a'对a赋值,肯定是错的,于是退出,返回成功接收到赋值的个数 0. 1 a进去时,首先a能获取1.但b不能获取'a',于是返回只是1 如果是 1 1的话,那就都成功,返回2 即返回值应为正确输入的个数,毕竟人家是输入函数嘛.

函数scanf的返回值

代码: #include <stdio.h> #include <stdlib.h> int main(void) { int i; double d; char ch; int counter; counter = scanf("%i %lf %c", &i, &d, &ch); printf("The return value of function is %d.\n", counter); return EXIT

scanf返回值问题

闲着没事看C primer plus,看到书中对于scanf输入的判断,常用如下方法: 此时它将返回1视为我输入成功,如果不为1则视为输入失败.那到底scanf的返回值具体指的是什么呢? 例子1: void main() { int a;int b;int c;printf("请输入三个整数:");int x=scanf("%d%d%d",&a,&b,&c);printf("%d/n%d/n",a,x);} 运行结果是:

scanf返回值的问题

关于scanf的返回值,MSDN里是这样写的:Both scanf and wscanf return the number of fields successfully convertedand assigned; the return value does not include fields that were read butnot assigned. A return value of 0 indicates that no fields were assigned.The retur

使用函数返回值的循环例子

计算数值的整数次幂的例子:实例程序: //power.c--计算数值的整数次幂 #include<stdio.h>  double power (double n,int p);//函数声明 int main(void) {  double x,xpow; int exp; printf("Enter a number and the positive integer power to which\n the number will be raised. Enter q to qui

C语言sacanf的返回值

1. scanf 函数是有返回值的,它的返回值可以分成三种情况 1) 正整数,表示正确输入参数的个数.例如执行 scanf("%d %d", &a, &b);       如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量):      如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量). 2) 0,表示用户的输入不匹配,无法正确输入任何值.如上例,用户如果输入",3 4&qu

C语言中的printf(),sprintf(),scanf(),sscanf()

在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望.由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出.这也导致sprintf 比printf 有用得多. printf 语法: #include <stdio.h> int printf( const char *format, ... ); printf()函数根据format(格式)给出的格式打印输出到STDOUT(标准输出)和其它参数中.返回

关于while(scanf_s(&quot;%d&quot;,&amp;x)!=0) 的逻辑错误 (scanf_s的 返回值)

背景:1.要求输入多组数据,然后输出什么东西,当第一个数输入的是0是,程序停止. 2.前几天学过 while(scanf_s("%d",&x)!=EOF) ctrl+z时停止 所以我想可以把EOF换成0,这样输 入0是就可以停止,但是事实证明我错了. 知识储备:scanf_s的返回值 : scanf("%d %d",&a,&b); 函数返回值为int型.如果a和b都被成功读入,那么scanf的返回值就是2: 如果只有a被成功读入,返回值为1: