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++);
}
进栈顺序:
-
i=1;算最后一个i++,i=2;将加之前i的值1送入堆栈。
-
i=2;算倒数第二个i++,i=3;将加之前i的值2送入堆栈。
-
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;
}