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

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;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五月的天气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值