printf与scanf的返回值、注意点

时间:2023-01-23 20:35:08

  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个长整数。