请问这串代码中的getchar()是做什么的?

我自己的分析:用getchar()循环的读入单个字符,第一次执行getchar()时候,我输入12345,按下enter键,这时候,标准输入流中包括换行符共有六个字符。
接下来,执行循环,每次getchar()自动的从当前流中读取一个字符,每当读取一个字符执行一次循环,直到循环结束。
这时形成了一个以str为首地址的字符串,这时候当前流的状态是'4''5''\n'。
在用cout输出的时候,它是怎么判断字符串什么时候,结束的。用strlen(str)输出长度为3,strlen()函数是以'\0'作为字符串结束标志判断字符串长度的。
我的想法哪有错吗?希望大家指正。

我想知道这个空字符到底哪儿来的????

cout 也是用 '\0' 判断字符串结尾的。 你只开辟了三个空间,然后填满了,于是其后是啥是不确定的。
是啊。已经被我填满了,cout以空自缚作为结束标志,可是这个'\0'是哪来的呢。难道这是系统自己添加的?怎么个添加法?

cout 也是用 '\0' 判断字符串结尾的。 你只开辟了三个空间,然后填满了,于是其后是啥是不确定的。

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

不好意思。写错了,是空字符。我是用循环对所开辟的空间元素逐个进行赋值,但是调用strlen函数是以空字符作为判断标准的,请问老师:这个空字符我并没有输入啊。从何而来?[/quote] 内存空间是连续的,而且是很大的。不是因为你开辟的三个,就只有三个,然后就“结束了”。 你开辟的三个空间只是一个很大的内存空间中的三个位置,在它前面和后面都还有很大的内存空间。 strlen 等程序并不知道(也不可能知道)哪些空间被分配给你了,哪些没有。它只是拿到一个地址,然后一直向后处理直到遇到一个 '\0' 为止。在你开辟的三个空间之后的内存并没有分配给你,也不由你控制。你不会知道其中都有什么内容(当然如果你想读,是可以读到的。其实 strlen 就是读到了其中的内容)。但是你不知道其中的内容(并且你不能控制其中的内容)并不意味着其中没有内容(这些内容可能是有除了你的程序以外的其它程序控制的)。strlen 会一直向后读到不知道哪一个位置碰巧是 '\0' 了为止。[/quote]申请三个char类型空间也就是是被操作系统所允许的并标志为可用状态的,这些只是很多内存中的一部分,对于此之外的部分。我也可以操作,strlen在此就做了。在此,也就是说它会接着那块我申请的那块内存非法越界访问,恰好遇到的第一个连续的字节就是空字符。
不好意思。写错了,是空字符。我是用循环对所开辟的空间元素逐个进行赋值,但是调用strlen函数是以空字符作为判断标准的,请问老师:这个空字符我并没有输入啊。从何而来?[/quote] 内存空间是连续的,而且是很大的。不是因为你开辟的三个,就只有三个,然后就“结束了”。 你开辟的三个空间只是一个很大的内存空间中的三个位置,在它前面和后面都还有很大的内存空间。 strlen 等程序并不知道(也不可能知道)哪些空间被分配给你了,哪些没有。它只是拿到一个地址,然后一直向后处理直到遇到一个 '\0' 为止。在你开辟的三个空间之后的内存并没有分配给你,也不由你控制。你不会知道其中都有什么内容(当然如果你想读,是可以读到的。其实 strlen 就是读到了其中的内容)。但是你不知道其中的内容(并且你不能控制其中的内容)并不意味着其中没有内容(这些内容可能是有除了你的程序以外的其它程序控制的)。strlen 会一直向后读到不知道哪一个位置碰巧是 '\0' 了为止。

这不是BUG,我想知道,在调用strlen的时候,编译器到底是怎样处理的。我并没有输入单个空字符。

恩,谢谢!我实在不知道,我所指的那个空字符是从何处来的。麻烦您看一下。很困扰

其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。 理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

引用 3楼赵4老师 的回复:
不好意思。写错了,是空字符。我是用循环对所开辟的空间元素逐个进行赋值,但是调用strlen函数是以空字符作为判断标准的,请问老师:这个空字符我并没有输入啊。从何而来?

1.进程和线程的差别。


线程是指进程内的一个执行单元,也是进程内的可调度实体.
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. 
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。


6.C/C++编译器中虚表是如何完成的?


7.谈谈COM的线程模型。然后讨论进程内/外组件的差别。


8.谈谈IA32下的分页机制


小页(4K)两级分页模式,大页(4M)一级


9.给两个变量,如何找出一个带环单链表中是什么地方出现环的?


一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方   ??


10.在IA32中一共有多少种办法从用户态跳到内核态?


11.如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现?

用内存映射或全局原子(互斥变量)、查找窗口句柄.. 
FindWindow,互斥,写标志到文件或注册表,共享内存。. 


12.如何截取键盘的响应,让所有的‘a’变成‘b’?


13.Apartment在COM中有什么用?为什么要引入?


14.存储过程是什么?有什么用?有什么优点?

    存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在。中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程用于实现频繁使用的查询、业务规则、被其他过程使用的公共例行程序

存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快

15.Template有什么特点?什么时候用?



答案:实际上除了“能够让应用程序处理存储于DBMS 中的数据“这一基本相似点外,两者没有太多共同之处。但是ADO 使用OLE DB 接口并基于微软的COM 技术,而 接口并且基于微软的.NET 体系架构。众所周知.NET 体系不同于COM 体系, 和ADO是两种数据访问方式。,看起来好像这些概念都广泛被PHP开发人员所了解。这就说明了PHP实际上到底是多专业。

  对于非常小的项目,它可以是一个十分符合人意的编程语言。但是对于较大的和更为复杂的项目,PHP就显出他的薄弱了。当你不断地摸索之后,你会发现笔者提到的某些问题的解决方案。所以,当解决方案已知之后,为什么不能修正他呢?另外为什么这些修补不在手册中提到呢?

  一个开源的语言十分流行是一件好事。但不幸得是,它不是一个伟大的语言。笔者希望所有的问题能有一天得到解决(也许在PHP6?),然后我们就将拥有一个开源语言,他既开源,又好用。

注意:要求提供完整代码,如果可以编译运行酌情加分。

注意:请尽可能详细描述你的数据结构、系统架构、设计思路等。建议多写一些伪代码或者流程说明。 
1.    考虑一个字符串替换的过程,在一个文本文件中含有一些文本内容和一些需要替换的变量,变量的格式为“$Var$”,原来的“$”使用“

$(t)100K(1.v,2.vn.v)(1.r,2.rn.r)使2G4CPU使Thisisan$FF$

百度11月4日网上笔试题及答案(仅供参考)
1用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。
函数的功能是拷贝src所指的内存内容前n个字节
到dest所指的地址上。

在用户输入英文单词时,经常发生错误,我们需要对其进行纠错。假设已经有一个包
含了正确英文单词的词典,请你设计一个拼写纠错
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度;
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。

搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串
的长度为1-255字节。假设目前有一千万个记录,
这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个
。一个查询串的重复度越高,说明查询它的用户越多,
也就是越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度。

给定一个字符串的集合,格式如:
要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)。

每输入一个字母: 
a)若可以顺利下行,则继续至结束,给出结果;
b)若该处不能匹配,纠错处理,给出拼写建议,继续至a);
字典采用27叉树组织,每个节点对应一个字母,查找就是一个字母
一个字母匹配.算法时间就是单词的长度k.
情况:当输入的最后一个字母不能匹配时就提示出错,简化出错处理,动态提示
(a)当前字母前缺少了一个字母:搜索树上两层到当前的匹配作为建议;
(b)当前字母拼写错误:当前字母的键盘相邻作为提示;(只是简单的描述,可 
根据分析字典特征和用户单词已输入部分选择(a),(b)处理

复杂性分析:影响算法的效率主要是字典的实现与纠错处理
(a)字典的实现已有成熟的算法,改进不大,也不会成为瓶颈;
(b)纠错策略要简单有效 ,如前述情况,是线性复杂度;
策略选择最是重要,可以采用统计学习的方法改进。

首先逐次读入查询串,算哈希值,保存在内存数组中,同时统计频度
(注意值与日志项对应关系)
选出前十的频度,取出对应的日志串,简单不过了。
哈希的设计是关键。 
(1)思路:先将集合按照大小排列后,优先考虑小的集合是否与大的集合有交集。有
就合并,如果小集合与所有其他集合都没有交集,则独立。独立的集合在下一轮的比
较中不用考虑。这样就可以尽量减少字符串的比较次数。当所有集合都独立的时候,
1.将集合按照大小排序,组成集合合并待处理列表
2.选择最小的集合,找出与之有交集的集合,
如果无,则与其它集合是独立集合,从待处理列表 中删除。
3.重复直到待处理列表为空

1。将集合按照大小从小到大排序,组成待处理的集合列表。
2。取出待处理集合列表中最小的集合,对于集合的每个元素,依次在其他集合中搜索
1>若存在,则将此小集合与大集合合并,并根据大小插入对应的位置 。转3
2>若不存在,则在该集合中取下一个元素。如果无下一个元素,即所有元素
都不存在于其他集合。则表明此集合独立,从待处理集合列表中删除。并加入结果集
3。如果待处理集合列表不为空,转2。
如果待处理集合列表为空,成功退出,则结果集合列表就是最终的输出。
假设集合的个数为n,最大的集合元素为m
排序的时间复杂度可以达到n*log(n)
然后对于元素在其他集合中查找,最坏情况下为(n-1)*m
查找一个集合是否与其他集合有交集的最坏情况是m*m*(n-1)
合并的时间复杂度不会超过查找集合有交集的最坏情况。
所以最终最坏时间复杂度为O(m*m*n*n)
需要说明的是:此算法的平均时间复杂度会很低,因为无论是查找还是合并,都是处
于最坏情况的概率很小,而且排序后优先用最小集合作为判断是否独立的对象,优先
与最大的集合进行比较,这些都最大的回避了最坏情况。
首先可以实现将每个集合里面的字符串按照字典序进行排列,这样就可以将查找以及
另外,可能采取恰当的数据结构也可以将查找以及合并等操作的效率得到提高

1 用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。

    也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
    所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。

我要回帖

更多关于 getchar在c语言中什么意思 的文章

 

随机推荐