当前位置: 代码迷 >> 综合 >> c语言scanf与printf(c primer plus Chapter 4 )
  详细解决方案

c语言scanf与printf(c primer plus Chapter 4 )

热度:59   发布时间:2023-11-13 14:22:27.0
1. C语言没有专门用于存储字符串的变量类型,字符串都是存储在char类型的数组中。字符串存放时末处的字符为"\0",即末尾要为空字符
2. size of 和 strlen的区别

?size of 是c语言的运算符,它以字节为单位给出对象的大小 。其返回的数字的类型为size_t类型,它是用 typedef 定义的 unsigned int 类型。

sizeof 后面接的运算对象是否加括号取决于其是变量还是类型,如果是类型则需要加括号,若是变量则可加可不加

#include<stdio.h>int main(int argc, char const *argv[])
{int sum ;int a ;sum = sizeof(int);printf("sum = %d\n",sum);sum = sizeof a;printf("sum = %d\n",sum);return 0;
}

??strlen()是函数,定义在<string.h>头文件中,其给出字符串中的字符长度。因为一字符用一位存储,所以极少时strlen得到的长度和sizeof得到的长度一样

#include<stdio.h>
#include<string.h>int main(int argc, char const *argv[])
{char name [40];scanf("%s",name);printf("sizeof(name) = %zd,strlen(name) = %lu\n",sizeof(name), strlen(name));	return 0;
}


所以总结一下 strlen求的是长度,sizeof求的是空间

3.c语言中的const关键字,用于限定一个变量为只读
4.printf函数和scanf函数

1??printf函数中使用的是值,无论是变量,常量还是表达式的值

#include<stdio.h>
#include<string.h>int main(int argc, char const *argv[])
{int a ;int b = 3;printf("test! a = %d,b = %d,c = %d\n",a,b,1);	return 0;
}

在这里插入图片描述
2??printf中的转换说明和参数传递

转换说明即是我们所使用的%d %lu这些占位符。由于不论是数字还是字符在计算机中存储时,都是以二进制存储的,printf的转换说明,就是按照指定的说明,将这些二进制数转换成指定的形式并显示出来。

#include<stdio.h>
#include<string.h>int main(int argc, char const *argv[])
{int a  = 336;printf("test! a = %c\n",a);return 0;
}

由上图可知,当将大于255的数字转化成字符是,实际上是336对256取模,得到80,ascii码80也就对应的是字符P

3??printf的参数传递机制

# include <stdio.h>main()
{
int i=1;printf(”%d  %d  %d”, i ,  i++,  i++);
}

进栈顺序:

  1. i=1;算最后一个i++,i=2;将加之前i的值1送入堆栈。

  2. i=2;算倒数第二个i++,i=3;将加之前i的值2送入堆栈。

  3. i=3;计算i,i=3;将加之前i的值3送入堆栈。

输出结果为(出栈顺序):3 2 1

#include<stdio.h>
int main(void)
{float n1 = 3.0;double n2 = 3.0;int n3 = 2000000000;int n4 = 1234567890;printf("n1 = %ld,n2 = %ld, n3 = %ld,n4 = %ld\n",n1,n2,n3,n4);
}


通过上面的例子,我们来讲解一下printf的参数传递问题.
emmm这个例子我还真的不会解释。。。明明按道理应该从右往左压入参数,int是四位,double是8位,float被转化成double这样的压入。哎搞不懂~
用gdb查看了一下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

?这里先留一个锅吧。。。

emm,据大佬是这样解释的,这里的浮点数用到了浮点寄存器,所以就不遵循传参规律了。。。

4??printf的返回值
printf也有返回值,其返回打印字符的个数。如果有错误输出,printf则返回一个负值。

#include<stdio.h>
int main(int argc, char const *argv[])
{int a;a = printf("heihei\n");printf(" a = %d\n", a);return 0;
}


5??scanf的输入 scanf("%c",&ch);从输入中第一个字符开始读取, scanf(" %c",&ch);从输入中第一个非空白字符开始读取
6??scanf函数的返回值
scanf函数返回成功读取的项数。
若没有读取任何项,且需要读取一个数字而用户读取一个非数字,则返回0
当scanf函数检测到“文件结尾“的时候,会返回EOF
7?? 采用变宽输入:printf & scanf的*修饰符

#include<stdio.h>
int main(int argc, char const *argv[])
{int width,precision;float number = 234.56;printf("please enter width and precision:\n");scanf("%d %d",&width,&precision);printf("number= %*.*f\n",width,precision,number);return 0;
}

8??scanf的输入示例(原谅我用fflush并没有刷新输出流成功)

#include<stdio.h>
int main(int argc, char const *argv[])
{char test[20];int a;float b;// scanf("%d",&a);// printf("int output: %d\n",a);// scanf("%f",&b);// printf("float output: %f\n",b);scanf("%s",test);printf("array output: %s\n",test);return 0;
}

在这里插入图片描述