Head First C学习日志,第二章 用指针输入数据
2015-12-29 00:00
316 查看
摘要: 再快不能快基础,大学时学的马马虎虎的c决定从这本书开始捡起来。
1.scanf
scanf的调用格式为:scanf("<格式说明字符串>",<变量地址>);
第2个参数一定是一个地址。
1.1输入字符串:
格式字符串%39s表示:最大接受39个字符(+’\0’),第2个参数name,是数组名作为指针使用,把地址传进了函数,scanf()便可以更新变量的内容。
1.2输入数字
格式字符串为%d,则接受的第二个参数为一个int*指针。
数组越界问题:如果忘记限制读取字符串的长度,用户就可以输入远远超出程序空间的数据,多余的数据会写到计算机还没有分配好的存储器中。缓冲区溢出很有可能会导致程序出错。
2.使用fgets输入
fgets和scanf一样,接受char指针,不同的是,你必须给它最大长度:
第1个参数为,接受指向缓冲区的指针,第2个参数为,接收字符串的最大长度(包含’\0’),第3个参数为输入,stdin表示来自标准输入流。
如果第1个参数不是数组,而是指针,则必须显式地指定其长度。
scanf可以输入多个字段,fgets不可以。
scanf遇到空格就会停止,fgets可以接受空格。
3.字符串字面值不能更新。
当这样声明:
char *cards = “JQK”;
计算机会在存储器的常量段中创建”JQK”,然后将cards指针(栈中)指向这一常量段的地址。常量段的数据不可以被更改。
如果想修改字符串,就复制它:
如果在存储器的非只读区段创建了字符串的副本,就可以修改它的字符了。
char cards[] = “JQK”;(用字符串初始化数组)
当声明了一个cards的数组,然后把它设置成字符串字面值,cards数组就成为了一个全新副本。cards不再是一个指向字符串字面值的指针,而是一个崭新的数组。
3.1 char cards[]的含义:
如果是普通的变量声明,cards就是一个数组,而且必须立即赋值。
如果以函数参数的形式声明,那么cards就是一个指针,与char *cards是等价的。
为了从此避免修改字面值的错误,我们应该这样做:如果想把指针设成字符串字面值,必须确保使用了const关键字。
const char *cards = “some string”;
这样一来,如果编译器发现代码试图修改字符串,就会提示编译错误。
1.scanf
scanf的调用格式为:scanf("<格式说明字符串>",<变量地址>);
第2个参数一定是一个地址。
1.1输入字符串:
char name[40]; printf("Enter your name:\n"); scanf("%39s",name);
格式字符串%39s表示:最大接受39个字符(+’\0’),第2个参数name,是数组名作为指针使用,把地址传进了函数,scanf()便可以更新变量的内容。
1.2输入数字
int age; printf("Enter your age:"); scanf("%d",&age); printf("age:%d\n",age);
格式字符串为%d,则接受的第二个参数为一个int*指针。
数组越界问题:如果忘记限制读取字符串的长度,用户就可以输入远远超出程序空间的数据,多余的数据会写到计算机还没有分配好的存储器中。缓冲区溢出很有可能会导致程序出错。
2.使用fgets输入
fgets和scanf一样,接受char指针,不同的是,你必须给它最大长度:
char food[5]; printf("Enter favorite food:"); fgets(food,sizeof(food),stdin);
第1个参数为,接受指向缓冲区的指针,第2个参数为,接收字符串的最大长度(包含’\0’),第3个参数为输入,stdin表示来自标准输入流。
如果第1个参数不是数组,而是指针,则必须显式地指定其长度。
scanf可以输入多个字段,fgets不可以。
scanf遇到空格就会停止,fgets可以接受空格。
3.字符串字面值不能更新。
当这样声明:
char *cards = “JQK”;
计算机会在存储器的常量段中创建”JQK”,然后将cards指针(栈中)指向这一常量段的地址。常量段的数据不可以被更改。
如果想修改字符串,就复制它:
如果在存储器的非只读区段创建了字符串的副本,就可以修改它的字符了。
char cards[] = “JQK”;(用字符串初始化数组)
当声明了一个cards的数组,然后把它设置成字符串字面值,cards数组就成为了一个全新副本。cards不再是一个指向字符串字面值的指针,而是一个崭新的数组。
3.1 char cards[]的含义:
如果是普通的变量声明,cards就是一个数组,而且必须立即赋值。
如果以函数参数的形式声明,那么cards就是一个指针,与char *cards是等价的。
为了从此避免修改字面值的错误,我们应该这样做:如果想把指针设成字符串字面值,必须确保使用了const关键字。
const char *cards = “some string”;
这样一来,如果编译器发现代码试图修改字符串,就会提示编译错误。
相关文章推荐
- 数据库链接字符串查询网站
- Linux C函数参考手册(PDF版)
- Flex字符串比较 还有Flex字符串操作
- Ruby常量查找路径问题深入研究
- Ruby中创建字符串的一些技巧小结
- ASP下经常用的字符串等函数参考资料
- 将字符串小写转大写并延时输出的批处理代码
- 将字符串转换成System.Drawing.Color类型的方法
- Lua教程(十七):C API简介
- Lua源码中字符串类型的实现
- Lua性能优化技巧(四):关于字符串
- 字符串聚合函数(去除重复值)
- Ruby中的字符串编写示例
- 总结的5个C#字符串操作方法分享
- sqlserver中求字符串中汉字的个数的sql语句
- sql server字符串非空判断实现方法
- VBS的字符串及日期操作相关函数
- C#实现将千分位字符串转换成数字的方法
- jquery 删除字符串最后一个字符的方法解析