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

隐身守侯 提交于 2020-02-29 01:27:06
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个参数为输入

【汇编】C++ 函数调用之——有参无返回调用(传值)

こ雲淡風輕ζ 提交于 2019-12-10 04:01:09
C++函数有参调用有几种传参方式: 一.传值 二.传指针(地址) 三.传引用 其中参数可被const修饰,也可以有默认值。下面分情况讨论: 为了简洁,省略main函数的汇编码而直接给出func函数的汇编码。 一.传值调用 有源代码: void func(int a,char b){ int c; c=a+b; } int main(int argc,char *argv[]) { //call func func(10,'a'); return 0; } 下面看看汇编码: 调用发生时: //call func func(10,'a'); //进行参数压栈操作,首先是'a'压入栈,然后是10压栈,然后call跳转表,再由调转表call函数 00F1141E push 61h 00F11420 push 0Ah 00F11422 call 00F1113B //函数调用完成后,栈减小8字节,两个dword,因为CPU对栈的操作都是双字操作,这里两个参数就是两个双字 00F11427 add esp,8 具体内存中的表现是这样的(先让func把栈初始化): 显然不在func的stack内,注意两个参数前面还有两个DWORD, 一个是00f1 1427,另一个是00dd f794;这两个DWORD的产生应该是在PUSH两个参数之后, 又有的两个PUSH, 显然,第一个PUSH 00f1

【算法系列 二】Stack

青春壹個敷衍的年華 提交于 2019-12-07 21:49:12
栈应用的场景: 1.括号问题 2.后缀表达式 3.深度优先遍历 4.保存现场 1. 给定字符串,仅由“()[]{}”六个字符组成。设计算法,判断该字符串是否有效。 括号必须以正确的顺序配对,如“()”、“()[]{}”是有效的,但 " ([)]"是无效的( Leetcode 20 )。 思想就是碰到左括号压栈,右括号出栈,然后判断弹出的元素是不是一对,最后栈为空则是真的。 代码如下: public class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<Character>(); boolean isvalid = true; char[] c = s.toCharArray(); char temp; for (int i = 0; i < c.length; i++) { switch (c[i]) { case '(': stack.push(c[i]); break; case ')': if(stack.isEmpty()) { isvalid = false; }else { temp = stack.pop(); if (temp != '(') { isvalid = false; } } break; case '[': stack.push(c

小蚂蚁学习数据结构(5)——线性结构——栈的操作演示

左心房为你撑大大i 提交于 2019-12-05 02:34:30
复习之前的内容 链表复习: 数据结构: 狭义: 数据结构是专门研究数据存储的问题。 数据的存储包含两方面,个体的存储,个体之间关系的存储。 广义: 数据结构既包含数据的存储也包含数据的操作 对存储数据的操作就是算法 算法: 狭义的算法是与数据的存储方式密切相关 广义的算法是与数据的存储方式无关 这就是泛型的思想 如何实现:1,通过模板;2,运算符的重载;3,通过指针 //这里需要去学习c++,不然很难理解 泛型: 利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的 数据的存储结构有几种 1,线性 连续存储(数组) 优点:存取的速度很快 缺点:插入删除元素就很慢了 实现必须知道数组的长度 插入删除元素很慢 空间通常是有限制的 需要大块连续的内存块 离散存储(链表) 优点:空间没有限制,只要内存够用 插入删除元素的速度很快,无需移动其他元素 缺点:存取速度慢 线性结构的应用 1 栈 2, 队列 2,非线性 树 图 到了今天的主题,栈的操作,跟链表还是非常相似的,只是栈将链表的有些功能给限制了。 /* 栈的操作 */ # include <stdio.h> # include <malloc.h> # include <stdlib.h> //节点结构体 typedef struct Node { int data; struct Node * pNext; }NODE,