文档章节

Head First C学习日志,第二章 用指针输入数据

AlexTuan
 AlexTuan
发布于 2015/12/29 00:06
字数 734
阅读 75
收藏 1

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

这样一来,如果编译器发现代码试图修改字符串,就会提示编译错误。


© 著作权归作者所有

AlexTuan
粉丝 4
博文 27
码字总数 17966
作品 0
程序员
私信 提问
Head First C 学习日志 第十章 进程间通信 输入输出重定向

Head First C 第十章 进程间通信 创建进程只是个开始如果你想控制运行中的进程,向进程发送数据或读取它的输出,该怎么办?通过进程间通信,进程可以合力完成某件工作。 进程内部一瞥 进程含...

AlexTuan
2016/04/09
61
0
Head First C学习日志 第六章用堆进行动态存储

书中的例子是,在多座岛屿间规划航线,并记录,将岛屿作为节点,数据结构如下 typedef struct island { char *name; char *opens; char *closes; struct island *next;} island; 注意,递归结...

AlexTuan
2016/02/21
68
0
Head First C学习日志 第六章 最高机密 二叉树和valgrind工具

程序会从根节点开始提问,其左右子树为疑犯名字或另外一个问题。先看数据结构: typedef struct node {char *question;struct node *no;struct node *yes;} node; 一个递归结构,内容很简单,...

AlexTuan
2016/02/23
59
0
数据结构之链表与数组(2):单向链表上的简单操作问题

原文出处:写代码的李纳 本文主要介绍一些解决单向链表上部分操作问题的思路和代码实现。 主要的问题包括以下几点: 向单向链表中插入一个节点 删除单向链表中的一个节点 查找单向链表中的一...

写代码的李纳
2015/11/11
0
0
1749:区块链:密码算法

每周学习十小时,这是2017年第49周的学习笔记 本周继续学习区块链,读了一本书。 区块链——技术驱动金融 有些内容看的时候还不是太理解,但想到李笑来说的,就算看不懂也要硬着头皮看下去,...

唐晓阳
2017/12/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
10
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部