c++的小腾遇到这样一个问题小问题

分析输出结果
&iostream&
struct base{
&&&&&&&&&&&&&
virtual void
print(){cout&&&base fun/n&;}
&&&&&&&&&&&&&&
struct derived:base{
&&&&&&&&&&&&&
print(){cout&&&derived fun/n&;}
int main(){
//b.print();
base *bp1=&
//bp1-&print();
base& br1=
//1.print();
base *bp2=&
bp2-&print();
base& br2=
br2.print();
cin.get();
2. Josephu&
问题为:设编号为1
个人围坐一圈,约定编号为k
开始报数,数到m
的那个人出列,它的下一位又从1
开始报数,数到m
的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
提示:用一个不带头结点的循环链表来处理Josephu
问题,先构成一个有n
个结点的单循环链表,然后由k
开始计数,记到m
时,对应结点丛链表中删除,然后被删除的结点得下一个结点又从1
开始记数,直到最后一个结点丛链表中删除,算法结束。
&stdlib.h&
struct Lnode
struct Lnode *
typedef struct
Lnode *LinkedL
LinkedList
InitLinkedList(){
static LinkedL
p=head=(LinkedList)malloc(sizeof(LinkedList));//head
起标记作用
head-&data=1;
//head-&next=NULL;
for(i=2;i&=n;i++){
temp=(LinkedList)malloc(sizeof(LinkedList));
temp-&data=i;//temp-&next=NULL;
LinkedList
ListFind(int location,LinkedList list){
for(i=1;i&i++){
temp=//list
代表头结点
list=temp-&
DeList(LinkedList list,int number){
LinkedList
while(n!=0){
for(i=1;i&i++){
list=list-&
printf(&%d &,list-&data);
temp-&next=list-&
list=list-&
free(temp);
/*p1-&next=p2-&
int main(void)
LinkedList ResultList,
//struct josephu *head,*p0;
int local,
printf(&/n
请输入分别总人数
用空格隔开
scanf(&%d%d%d&,&n,&local,&num);
//InitLinkedList(q);
//ListFind(local,q)
//del(q,num);
ResultList=InitLinkedList();
list=ListFind(local,ResultList);
DeList(list,num);
3判断下列是否正确
(1).char *dst=&hello&;
&& strcpy(str,dst);//错误,因为&hello&位于常量区,strcpy函数实现便错误
(2)char *str=NULL
&&& char dest[]=&hello&;
&& strcpy(dest,str);//错误,因为空指针..
4、(1)char a[]=&20a/012&& ;求sizeof(a)&&& 答案为5,/0代表了空字符(NULL);& 没有解析成/ddd的模式,即字节代码
&&&& (2)short int a=65539; printf(a);&&&&& 答案为3&&
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:82497次
积分:1111
积分:1111
排名:第18106名
原创:23篇
转载:60篇
(1)(3)(4)(3)(11)(5)(5)(2)(1)(3)(6)(1)(2)(1)(16)(6)(11)(2)&& 查看话题
一个简单的C++程序运行问题
现有一个编写好的后缀为.cc的C++程序,另外还有.cc程序里对应的算法文件,但是由于没有学过C++,不会运行,希望能详细解答一下怎样是他们连接到一起并运行。
用#include&文件名&试试 我也刚学,不过,一般都是.cpp啊,没见过.cc文件 : Originally posted by cheng134148 at
我也刚学,不过,一般都是.cpp啊,没见过.cc文件 我问了一下别人,要用linux下G++来运行&&挺复杂的 cc也是一种c++文件扩展名,还有cpp, cxx
正常用就行了,没必要非得linux
windows上也有g++
如果没有设计linux系统专有函数,只是一些基础算法的话,在vs上也可以编译运行。 用记事本打开, 把里面的代码复制到cpp或c文件中, 试下能不能运行。 .cc是基于Linux下的G++ gcc编译C++程序
http://blog.csdn.net/shanxiao528/article/details/5578743 不同的平台里边的函数库不同,win平台和linux有区别。debug的话两者方法也有不同。可以在网上找debug教程。
var cpro_id = 'u1216994';
欢迎监督和反馈:本帖内容由
提供,小木虫仅提供交流平台,不对该内容负责。欢迎协助我们监督管理,共同维护互联网健康,如果您对该内容有异议,请立即发邮件到
联系通知管理员,也可以通过QQ周知,我们的QQ号为:8835100
我们保证在1个工作日内给予处理和答复,谢谢您的监督。
小木虫,学术科研第一站,为中国学术科研研究提供免费动力
广告投放请联系QQ: &
违规贴举报删除请联系邮箱: 或者 QQ:8835100
Copyright &
eMuch.net, All Rights Reserved. 小木虫 版权所有新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
空间积分0 信誉积分168 UID阅读权限10积分15帖子精华可用积分15 专家积分0 在线时间184 小时注册时间最后登录
白手起家, 积分 15, 距离下一级还需 185 积分
帖子主题精华可用积分15 专家积分0 在线时间184 小时注册时间最后登录
论坛徽章:0
20可用积分
一个对象,自己有virtual函数,继承了父类的virtual函数,那么就相当于有了两个虚函数指针。
下面的程序中,s5继承了两个父类,自己也有virtual函数,那么我认为,在32位系统上,它应该有3个虚表指针,大小应该是12。
但是运行结果却是8。我尝试了vc,一样的效果:#include &stdafx.h&
#include &string&
struct s1{
& & virtual void f();
};
struct s2{
& & virtual void g();
};
struct s3: public s1{
& & virtual void f();
};
struct s4: public s1,s2{//s4的大小是8,我理解。
};
struct s5: public s1,s2{//s5的大小是8,我就不理解了。难道不是12么?
& & virtual void h();
};
int&&main( void){
& & printf(&%d,%d,%d,%d,%d\n&,sizeof(s1),sizeof(s2),sizeof(s3),sizeof(s4),sizeof(s5));
& & return 0;
}复制代码我认为s5的对象应该是这样子长的:
----------------
|&&s1 vtbl_ptr&&|
----------------
|&&s2 vtbl_ptr&&|
----------------
|&&s5 vtbl_ptr&&|
----------------
为什么和我想象的不一样呢?
回复 10# donet8
仔细看我在9楼的帖子,编译器必须在对象构造的时候就给 vptr 赋值。等到虚函数调用的时候,只要把 vptr 的值加上具体虚函数的偏移量,就找到了正确的入口。
这就要求,同一个虚函数在父类和子类的虚表中,必须保持相同的偏移量。
假设 f(), g() 来自父类 B1, x(), y() 来自父类 B2,D 同时继承B1 和 B2
假设f(),g() 在 B1 的虚表中位于第1位和第2位;那么它们在D的虚表中就也必须在第1位和第2位;
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
空间积分0 信誉积分131 UID阅读权限10积分82帖子精华可用积分82 专家积分0 在线时间24 小时注册时间最后登录
白手起家, 积分 82, 距离下一级还需 118 积分
帖子主题精华可用积分82 专家积分0 在线时间24 小时注册时间最后登录
论坛徽章:0
仔细看我在9楼的帖子,编译器必须在对象构造的时候就给 vptr 赋值。等到虚函数调用的时候,只要把 vptr 的值加上具体虚函数的偏移量,就找到了正确的入口。
这就要求,同一个虚函数在父类和子类的虚表中,必须保持相同的偏移量。
假设 f(), g() 来自父类 B1, x(), y() 来自父类 B2,D 同时继承B1 和 B2
假设f(),g() 在 B1 的虚表中位于第1位和第2位;那么它们在D的虚表中就也必须在第1位和第2位;
x(),y() 在 B2的虚表中位于第1位和第2位;那么它们在D的虚表中就也必须在第1位和第2位;
如果用同一张虚表,你怎么让 f(),g() 和 x(),y() 同时在第1位和第2位呢?
空间积分0 信誉积分617 UID7672252阅读权限100积分48380帖子精华可用积分48382 专家积分243 在线时间2705 小时注册时间最后登录
帖子主题精华可用积分48382 专家积分243 在线时间2705 小时注册时间最后登录
论坛徽章:0
struct s3的大小可能是4,你理解么?
struct s31 : s1 { virtual void f(); virtual void g(); /*再多加一个虚函数*/ }; 它的大小也可能只有4,你理解么?
s5大小是12就没什么不好理解的了……
&一些人总认为可以用自己的思想驾驭编程语言,殊不知自己颇为自信的思想其实也被编程语言所影响着& 不管你信不信,反正我是信了。
ユッキは&&あっん~ん~&&由乃が守ってあげる&&ね? ユッキ
CU13:wwwsq,nvoy,534231qwz,qopu,jzpzy,zscoreh,uW.namrebyC
空间积分0 信誉积分455 UID阅读权限10积分145帖子精华可用积分145 专家积分0 在线时间738 小时注册时间最后登录
白手起家, 积分 145, 距离下一级还需 55 积分
帖子主题精华可用积分145 专家积分0 在线时间738 小时注册时间最后登录
论坛徽章:3
本帖最后由 wjianc 于
22:43 编辑
我是这么理解的:
1. 有虚函数的类都有一个一维的虚函数表叫虚表,虚表里存放着虚函数的地址
2. 有虚函数的类对象保存着一个指向虚表的指针
3. 父类和子类共享虚表指针
4. 多重继承增加额外的指针
对照以上几条:
* 就算s4你加上虚函数成员,sizeof(s4)大小也不会变
* s5你再多加一个父类,会多增加一个虚表指针
空间积分0 信誉积分131 UID阅读权限10积分82帖子精华可用积分82 专家积分0 在线时间24 小时注册时间最后登录
白手起家, 积分 82, 距离下一级还需 118 积分
帖子主题精华可用积分82 专家积分0 在线时间24 小时注册时间最后登录
论坛徽章:0
本帖最后由 bufferfly 于
13:16 编辑
解释有误,请看
空间积分0 信誉积分168 UID阅读权限10积分15帖子精华可用积分15 专家积分0 在线时间184 小时注册时间最后登录
白手起家, 积分 15, 距离下一级还需 185 积分
帖子主题精华可用积分15 专家积分0 在线时间184 小时注册时间最后登录
论坛徽章:0
OwnWaterloo 发表于
struct s3的大小可能是4,你理解么?
struct s31 : s1 { virtual void f(); virtual void g(); /*再多加一 ...
我知道的基础知识: 一个类有虚函数,就有了虚指针,size+4。无论有多少个虚函数,都只有一个虚指针,size还是+4。虚指针指向虚函数表。struct s{
& &virtual void f();
& &virtual void g();
& &virtual void h();
};复制代码sizeof(s)一直都是4.
但是问题是,为什么在vc的编译器实现中,多继承时,通常子类的虚函数表跟第一个父类的虚函数表在一起,所以只用一个虚指针? 会不会有什么逻辑上的冲突啊。
如果有了N(N&2)个父类,就再增加(N-1)个虚指针?
我感觉这个解释这个不太清楚,因为如果我有class2和class3都是从class1继承的struct class1{
& & virtual void f(){printf(&class1.f()\n&);}
};
struct class2: class1{
& & virtual void f(){printf(&class2.f()\n&);}
};
struct class3: public class1{
& & virtual void f(){printf(&class3.f()\n&);}
};复制代码那么,难道说class1的虚函数表不单独存在,而是class2的虚函数表=class1+class2,class3的虚函数表=class1+class3.
我不知道上面两位大侠说的,是不是这个意思。
空间积分0 信誉积分131 UID阅读权限10积分82帖子精华可用积分82 专家积分0 在线时间24 小时注册时间最后登录
白手起家, 积分 82, 距离下一级还需 118 积分
帖子主题精华可用积分82 专家积分0 在线时间24 小时注册时间最后登录
论坛徽章:0
本帖最后由 bufferfly 于
14:33 编辑
解释有误,请看
空间积分0 信誉积分455 UID阅读权限10积分145帖子精华可用积分145 专家积分0 在线时间738 小时注册时间最后登录
白手起家, 积分 145, 距离下一级还需 55 积分
帖子主题精华可用积分145 专家积分0 在线时间738 小时注册时间最后登录
论坛徽章:3
donet8 发表于
我知道的基础知识: 一个类有虚函数,就有了虚指针,size+4。无论有多少个虚函数,都只有一个虚指针,si ...
是的,&&该类实例的头4个字节就是虚表指针.
VC++. GCC实现时 子类和父类共享虚指针, 只有一个虚指针, 子类将自己的虚函数插在父虚函数之前.
但是多重继承另外的父类虚指针则不共享, 有一个就增加一个虚指针.
空间积分0 信誉积分168 UID阅读权限10积分15帖子精华可用积分15 专家积分0 在线时间184 小时注册时间最后登录
白手起家, 积分 15, 距离下一级还需 185 积分
帖子主题精华可用积分15 专家积分0 在线时间184 小时注册时间最后登录
论坛徽章:0
bufferfly 发表于
回复 5# donet8
我没有混淆,我在5L里面已经说了:
&我知道的基础知识: 一个类有虚函数,就有了虚指针,size+4。无论有多少个虚函数,都只有一个虚指针,size还是+4。虚指针指向虚函数表。&
我的问题是,既然子类和父类公用一个虚指针不冲突,那么多余一个父类的话,为什么要添加虚指针呢? 多于一个父类就冲突了?
空间积分0 信誉积分131 UID阅读权限10积分82帖子精华可用积分82 专家积分0 在线时间24 小时注册时间最后登录
白手起家, 积分 82, 距离下一级还需 118 积分
帖子主题精华可用积分82 专家积分0 在线时间24 小时注册时间最后登录
论坛徽章:0
本帖最后由 bufferfly 于
14:37 编辑
要想完美的解释你的问题,恐怕要涉及到C++编译器的很多设计细节,我并不是写编译器的,但可以告诉你一个大概的思路。
一般的书上都说,虚函数是在运行时根据对象的实际类型“动态决定”函数入口。但什么是“动态决定”呢?实际上C++编译器在实现这个功能的时候,并非真的等到虚函数被调用时才去判断这个对象是什么类型的。下面我用一个简单的图表来说明C++编译器到底干了些什么。假设有两个类
struct Base {
&&virtual void f();
&&virtual void g();
struct Derived : public Base {
&&virtual void f();
&&virtual void g();
Base 和 Derived 各有一个虚表,分别是 VTable_B 和 VTable_D ,那么编译器是怎么通过只用一个虚表指针来实现下面的“动态”调用呢?
Base *pB = new Derived();
先让我们看Base和Derived对象是怎么存储的,以及两个类的虚表结构
Base:& && && && && && &&&VTable_B:
------------& && && &-------------
|&&vptr& && & |& && &&&|&&f() 入口& & |
+---------+& && &&&+----------+
|&&Base的& &|& && &&&|&&g() 入口& &|
|& & 数据& &&&|& && &&&-------------
------------
Derived:& && && && && & VTable_D:
------------& && &&&--------------
|&&vptr& && & |& && &&&| f() 入口& &&&|
+---------+& && &&&+----------+
|&&Base的& &|& && &&&| g() 入口& & |
|& & 数据& &&&|& && &&&-------------
+---------+
| Derived的|
|& & 数据& &&&|
------------
pB 指针既可以指向 Base 对象,也可以指向 Derived 对象,所以 pB 本身是不确定的。但是,任何对象本身却从被 new 出来开始就是确定的,所以 Base 对象在构造时,编译器会往 vptr 中填上 VTable_B 的地址,而 Derived 对象在构造时,编译器会往 vptr 中填上 VTable_D 的地址。
等到虚函数被调用的时候,也就是 pB-&f() 这行语句被执行的时候,编译器并不需要知道 pB 到底是指向 Base 还是 Derived ,它只要直接用 vptr 就能找到正确的虚表和虚函数入口了,父类和子类的虚表结构是相似的,同一个虚函数入口在父表和子表的偏移量都是一样的。
通过上面这些介绍,我想你应该能理解,为什么在单一继承的条件下,不管有多少层继承,每个对象只需一个 vptr 就行了。
多重继承的条件下,一个 vptr 行不行呢?
不行。多重继承的时候,虚函数既有来自父类1的,也有来自父类2的,所以这些虚函数入口是不能放在同一个虚表当中的。假设 Derived 除了 Base外,还继承 Base2,并且 Base2 中有两个虚函数 x() 和 y (),那么 Derived 对象的存储结构也许是这样的(只是大概,和具体编译器相关)。
Derived:& && && && && & VTable_D:
------------& && &&&--------------
|&&vptr& && & |& && &&&| f() 入口& &&&|
+---------+& && &&&+----------+
|&&Base的& &|& && &&&| g() 入口& & |
|& & 数据& &&&|& && &&&-------------
+---------+
| vptr2& && &|& && && & VTable_D2:
+---------+& && &&&-------------
| Base2的&&|& && &&&|&&x() 入口& & |
|& & 数据& &&&|& && &&&+-----------+
+---------+& && &&&| y() 入口& &&&|
| Derived的|& && &&&-------------
|& & 数据& &&&|
------------
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处学习使用Visual C++6.0中的一个小问题
[问题点数:20分,无满意结帖,结帖人lianggg911]
学习使用Visual C++6.0中的一个小问题
[问题点数:20分,无满意结帖,结帖人lianggg911]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
空间积分0 信誉积分102 UID阅读权限10积分16帖子精华可用积分16 专家积分0 在线时间3 小时注册时间最后登录
白手起家, 积分 16, 距离下一级还需 184 积分
帖子主题精华可用积分16 专家积分0 在线时间3 小时注册时间最后登录
论坛徽章:0
fgets(char *buf,int n,FILE *fp)中的n限制了每行的字符个数,但是在偶的
程序中却无法限制。即只要n&;1,则可以读远远大于n的字符。
请问这是为什么?
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
空间积分0 信誉积分100 UID阅读权限10积分92帖子精华可用积分92 专家积分0 在线时间4 小时注册时间最后登录
白手起家, 积分 92, 距离下一级还需 108 积分
帖子主题精华可用积分92 专家积分0 在线时间4 小时注册时间最后登录
论坛徽章:0
关于函数fgets的一个小问题
你怎么确定它读了许多字符?
是用printf()之类的函数显示的吗?
你用fwrite()函数写到一个文件中看它读了多少东西.
空间积分0 信誉积分100 UID677564阅读权限20积分362帖子精华可用积分362 专家积分0 在线时间1 小时注册时间最后登录
稍有积蓄, 积分 362, 距离下一级还需 138 积分
帖子主题精华可用积分362 专家积分0 在线时间1 小时注册时间最后登录
论坛徽章:0
关于函数fgets的一个小问题
fgets(char*S,intn,FILE*stream)
Reads characters from the standard input stream, stdin
into the array pointed to by S, until a new-line
character is read or an end-of-file condition is
encountered.&&The new-line character is discarded and
the string is terminated with a null character.
空间积分0 信誉积分100 UID阅读权限20积分1709帖子精华可用积分1709 专家积分0 在线时间0 小时注册时间最后登录
丰衣足食, 积分 1709, 距离下一级还需 -709 积分
帖子主题精华可用积分1709 专家积分0 在线时间0 小时注册时间最后登录
论坛徽章:0
关于函数fgets的一个小问题
n值只是限定从键盘输入上截取的最大字符数而已。剩余的字符将保留在缓冲区中,如果是循环调用fgets的话,就能看到如果输入的字符个数大于n的话,下次填充fgets中buf的字符就是上次剩余的字符。也就是说,fgets以n为长度每次处理最大n个字符,直到遇到换行符为止。
轻松做自己,快乐做自己!
人似秋鸿来有信,
事如春梦了无痕.
空间积分0 信誉积分100 UID41991阅读权限100积分4382帖子精华可用积分4382 专家积分0 在线时间4 小时注册时间最后登录
帖子主题精华可用积分4382 专家积分0 在线时间4 小时注册时间最后登录
论坛徽章:1
关于函数fgets的一个小问题
hp-11中对于gets和fgets的描述。不知道wangz的解释来源于什么系统?
& && &char *gets(char *s);
& && &char *fgets(char *s, int n, FILE *stream);
*************************************************
& && &gets()& && && &Reads characters from the standard input stream, stdin,
& && && && && && && &into the array pointed to by s, until a new-line
& && && && && && && &character is read or an end-of-file condition is
& && && && && && && &encountered.&&The new-line character is discarded and
& && && && && && && &the string is terminated with a null character.
*************************************************
& && &fgets()& && &&&Reads characters from the stream into the array pointed
& && && && && && && &to by s, until n-1 characters are read, a new-line
& && && && && && && &character is read and transferred to s, or an end-of-
& && && && && && && &file condition is encountered.&&The string is then
& && && && && && && &terminated with a null character.复制代码
空间积分0 信誉积分102 UID阅读权限10积分16帖子精华可用积分16 专家积分0 在线时间3 小时注册时间最后登录
白手起家, 积分 16, 距离下一级还需 184 积分
帖子主题精华可用积分16 专家积分0 在线时间3 小时注册时间最后登录
论坛徽章:0
关于函数fgets的一个小问题
程序是这样的:& && &
& && && &while(fgets(buf,n,stdin)!=NULL)
& & & & & & & & if(fputs(buf,stdout)==EOF)
& & & & & & & & & & & & err_sys(&output error"
&&比如我把n设为10, 预想中的结果是每一次操作是输入10个以上的字符后,只打印10个。
可是我输入几个,打印几个。
空间积分0 信誉积分100 UID41991阅读权限100积分4382帖子精华可用积分4382 专家积分0 在线时间4 小时注册时间最后登录
帖子主题精华可用积分4382 专家积分0 在线时间4 小时注册时间最后登录
论坛徽章:1
关于函数fgets的一个小问题
比如我把n设为10,预想中的结果是每一次操作是输入10个以上的字符后,只打印10个。
可是我输入几个,打印几个。
超过10个(包括结束符),只打印9个,不超过10个,输入多少,打印多少。
这里说得是有效字符,不包含buf中可能存在的不可预知字符。比如,做了memset(buf,0x0,sizeof(buf));
空间积分0 信誉积分100 UID7452700阅读权限20积分347帖子精华可用积分347 专家积分0 在线时间6 小时注册时间最后登录
稍有积蓄, 积分 347, 距离下一级还需 153 积分
帖子主题精华可用积分347 专家积分0 在线时间6 小时注册时间最后登录
论坛徽章:0
关于函数fgets的一个小问题
原帖由 &unix_player& 发表:
程序是这样的:& && &
& && && &while(fgets(buf,n,stdin)!=NULL)
& & & & & & & & if(fputs(buf,stdout)==EOF)
& & & & & & & & & & & & err_sys(&output error"
&&比如我把n设为10, 预想中的结果是每一次操作是输入10个以上的字符后,只打印10个..........
你buf[10]!=0,所以就帮你把打印出来了.
空间积分0 信誉积分100 UID583809阅读权限20积分242帖子精华可用积分242 专家积分0 在线时间1 小时注册时间最后登录
稍有积蓄, 积分 242, 距离下一级还需 258 积分
帖子主题精华可用积分242 专家积分0 在线时间1 小时注册时间最后登录
论坛徽章:0
关于函数fgets的一个小问题
while(fgets(buf,n,stdin)!=NULL)
n不是终止读取的标志,只是一些图书的误导吧。
fgets函数从FILE指定的流中读取最多n个字符的字符串,并把它存储在s指定的数组
中。当遇到换行符或文件结束符后,不再读取任何字符。当最后一个字符读入数组后,立刻添
加一个null字符。
以上是ansi c给fgets的定义。
空间积分0 信誉积分100 UID41991阅读权限100积分4382帖子精华可用积分4382 专家积分0 在线时间4 小时注册时间最后登录
帖子主题精华可用积分4382 专家积分0 在线时间4 小时注册时间最后登录
论坛徽章:1
关于函数fgets的一个小问题
对于hp-11,我测试了一下,实际结果和man中描述的一样。如下:
& && &fgets()& && &&&Reads characters from the stream into the array pointed
& && && && && && && &to by s, until n-1 characters are read, a new-line
& && && && && && && &character is read and transferred to s, or an end-of-
& && && && && && && &file condition is encountered.&&The string is then
& && && && && && && &terminated with a null character.
可能不同的系统对这个函数的处理有一定的差别。我觉得使用的时候最好man一下自己的系统,或者为了安全按照ANSI C的标准写代码。
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处

我要回帖

更多关于 史上最变态的11个问题 的文章

 

随机推荐