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