字符串比较函数的汇编debug调试代码吗?VC++调试过程中的错误

调试错误集锦
/ 个人分类:
############1. read、write和close对应到C++库是什么函数read write close 在#include &unistd.h&fread fwrite fclose 在stdio.hread write close ----&系统调用 fread fwrite fclose ----&对应的库函数The C Programming Language上有介绍
##############2. 使用gdb调试,如何进入所调用函数的内部(在另一个源文件内)用断点(breakpoint)break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:(gdb) break line-number 使程序恰好在执行给定行之前停止。(gdb) break function-name 使程序恰好在进入指定的函数之前停止。(gdb) break line-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。(gdb) break routine-name 在指定例程的入口处设置断点如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下:(gdb) break filename:line-number(gdb) break filename:function-name要想设置一个条件断点,可以利用break if命令,如下所示:(gdb) break line-or-function if expr例:(gdb) break 46 if testsize==100从断点继续运行:countinue 命令
###############3. 怎么设定string的长度?可以啊,string data(n,'c')初始化为字符'c'的n个副本就能在初始化时设定固定的大小了调用string.reverse可以预先申请空间
##############4. int length()中const的作用& 类成员函数中const的使用&& & 一般放在函数体后,形如:void& fun()&&& & 任何不会修改数据成员的函数都该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其他非const成员函数,编译器将报错,这大大提高了程序的健壮性。1. 不能对成员进行赋值。2. 不能调用非const成员函数。3. 将类数据成员传递给外部函数时,将为该数据成员加上const属性。
#################5. 关于双向链表尾部添加& 书上说在中间和尾部节点后添加的代码是一致的:q-&next=p-&q-&prior=p;p-&next-&prior=q;p-&next=q;尾部添加时 p-&next-&prior=q;有意义吗?不是 p-&next就是NULL了吗?谁解释下
那就是书上错了在p-&next-&prior=q; 前判断一下p-&next!=NULL就可以通用
################6. .c转为.cpp出错server.cpp:67: 错误:从类型 ‘int*’ 到类型 ‘socklen_t*’ 的转换无效server.cpp:67: 错误:& 初始化实参 3,属于 ‘int accept(int, sockaddr*, socklen_t*)server.cpp:73: 错误:‘inet_ntoa’ 在此作用域中尚未声明
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&&&&&&&&&&&&&&&&&&&&&&&&& &sin_size))==-1)should beif((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&&&&&&&&&&&&&&&&&&&&&&&&& (socklen_t*)&sin_size))==-1)
replace inet_ntoa with inet_ntop, the latter is recommended and add header files
#include &sys/types.h&#include &socket.h&#include &arpa/inet.h&
###############7。 运行autoscan时出错如下,是什么原因?autom4te: configure.ac: no such file or directoryautoscan: /usr/bin/autom4te failed with exit status: 1
不影响正常使用
##############8 fork执行的问题总是把pid == 0执行很多次,在执行父进程很多次,不是应该交叉执行的吗 ?void main(){ /*子进程的返回数值*/while(1){/* 从终端读取要执行的命令 */int pid = fork();if ( pid == 0 ){/* 子进程执行此命令 */execlp("ls", "ls", "-al", "/etc/passwd", 0);/* 如果exec函数返回,表明没有正常执行命令,打印错误信息*/perror("ERROR!!!!!!!!!!!!!!!!");exit(errno);}else{/* 父进程, 等待子进程结束,并打印子进程的返回值 */wait ( &rtn );printf( " child process return %dn",rtn );}}}
fork之后,父进程和子进程执行的顺序,没有固定的规定,一切皆有可能
##############9& 这段程序怎么不执行printf("child");呢?C/C++ code
int fork2(void) { pid_ pid = fork(); if(pid & 0) { perror("fork error"); } else if(pid == 0) //在这一块,用一个if语句来判断这一部分是子进程的代码空间 { printf("child"); if(execlp("ls", "ls", "-al", "/etc/passwd", 0) & 0) perror("execl (ls) error"); } else { //对应的父进程的代码空间 wait((int *)0); // wait 语句可以用来等待子进程结束。 printf("done!\n"); } exit(0);
&改成printf("child\n");就好了,可能是刷新缓存的事printf("child");追加flush();
################10为什么traceroute测出的延时比ping测出的大,都是一跳的如果是一跳的平均时间的话,可能是因为traceroute每一跳都得给主机返回一个超时ICMP报文
##############11 const char *ct 是限制ct不变还是*ct不变,还是两者都受限制不变?限制*ct不变
const char *ct //限制*ct不变char * const ct //限制ct不变const char *const ct//两者都限制
#################12& 又见段错误,不知原因/bin/sh:line 1:7315 段错误host.c
C/C++ code
&&& int main(int argc, char *argv[]) { printf("Hello, world!\n"); char *s1="wo shi ge hao hai zi!"; char *s2 = (char *)malloc(50); char *s3="cai bu shi"; char *s4=strchr(s1,'j'); if(*s4!=NULL) { printf("%s\n",s4); } free(s2); return EXIT_SUCCESS; }
if(*s4!=NULL)这句明显的错误么。 应该是if(s4 != NULL )错误的那句是因为s4为NULL(即0) ,*s4 当然会段错误,因为访问的是 0地址可以编译过是因为他把那个表达式作为算数表达式了如果你编译的时候不要关闭警告,因该会有 warning: NULL used in arithmetic 这么一句警告的
该错误是在LINUX下用Kdevelop出现的,是怎么回事哩?/bin/sh: line : 13397 段错误 工程中有3个源文件 :host.cC/C++ code&&& #include &stdio.h& #include &stdlib.h& #include "str.h" int main(int argc, char *argv[]) { printf("Hello, world!\n"); char *s1="wo shi ge hao hai zi!"; char *s2; strcpy(s2,s1); return EXIT_SUCCESS; }
没有分配内存。char *s2 = new char[100];
##################13& 文件发送问题& 我上面写的有问题,接收端不负责文件大小问题是long filesize(FILE *stream){&&& long curpos,&&& curpos = ftell(stream);&&& fseek(stream, 0L, SEEK_END);&&& length = ftell(stream);&&& fseek(stream, curpos, SEEK_SET);&&&}把回车换行当成两个字符,发送只把它当成一个字符'\10',结果就多发送出去回车换行个垃圾字符看来filesize该修正了,怎么才能把回车换行当成一个字符。。
问题解决啦我不用filesize算出的长度,用fread返回的长度就行了谢谢大家帮忙,特别是dahua010
##################14& 字符串拷贝的问题char *strcpy(char *dest, const char *src)void *memcpy(void *dest, const void *src, size_t n)而strcpy(str,pack-&GetPayloadData());中的pack-&GetPayloadData()返回的是unsigned char *所以报错cannot convert parameter 2 from 'unsigned char *' to 'const char *'是不是memcpy功能比strcpy强,可以替代它?
memcpy内存拷贝,不过也是经常用于字符串。strcpy以'\0'结束字符数组拷贝。
LZ的问题应该可以转换下 void * 和 char *原来早期版本 参数是 char * ,后来使用类属指针来代替 char *,消除一些强制转换
#################15& 例子中接收代码收到的数据包,是放在RTPPacket结构中,而且接收代码只返回了RTPPacket大结构,没有关于payload的返回,想要保存接收的数据包怎么办? GetPayloadData,你要的是这个方法吗 ?
#################16打开文件为什么是空?fp=fopen("C:\Lw.txt","r+");
C:\\Lw.txt& 双斜杠
##################16& 对继承函数的调用问题& 在类RTPSession中有一个虚函数:virtual void OnPollThreadStep() { }我在MyRTPSession 中把它实现:class MyRTPSession : public RTPSession{protected:void OnPollThreadStep();调用的部分是这样的:RTPSession &rtpsession.OnPollThreadStep();& 但是函数调用还是调用RTPSession中的那个,而不是MyRTPSession 中的那个,为什么啊?
MyRTPSRTPSession *p = &p-&OnPollThreadStep();
上面的方式应该调用子类的函数了。
################17& 在c程序中调用C++lib库jrtplib的问题&jrtplib 好象是用c++写的,提供了类接口如果你想用c调用,你可能要再用c++封装一层,然后再给c调用简单的说,就是,把对象的方式转换成过程的方式;比如:RTPSsess.Create()sess.AddDestination();写成用C能认得的方式:RTPSint Create(){& sess.Create();& return 0;}int AddDestination(){& sess.AddDestination();& return 0;}
在C中调用C++的函数可以加一个声明extern "C++" void func();试着在C中用extern "C++"声明导入C++编写的jrtplib库函数
######################18& 这个程序有个小问题,buf接收正确,但是打印不出来,谁知道说说啊找到了,问题出在这句上,if((numbytes=recv(sockfd,buf,MAXDATASIZE-1,0)==-1))改为if((numbytes=recv(sockfd,buf,MAXDATASIZE-1,0))==-1)就好了.
###############19& Redhat AS4 中没有ifconfig不在root下不能使用一些命令,如:ifconfig,ifup,ifdown等.我一直是用普通用户登录的,所以不能用.
#################20 什么时候调用构造函数?& (1) 在全局范围中定义的对象(即在所有函数之外定义的对象),它的构造函数在文件中的所有函数(包括main函数)执行之前调用。但如果一个程序中有多个文件,而不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的。当main函数执行完毕或调用exit函数时(此时程序终止),调用析构函数。(2) 如果定义的是局部自动对象(例如在函数中定义对象),则在建立对象时调用其构造函数。如果函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束、对象释放时先调用析构函数。(3) 如果在函数中定义静态(static)局部对象,则只在程序第一次调用此函数建立对象时调用构造函数一次,在调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。
##################21& 构造函数与析构函数的执行顺序构造函数顺序为:&& 1.& 全局对象的构造函数;&2.& main函数中对象的构造函数,包括automatic、static依次调用;&3.& main中遇到函数中有局部对象时,进入到函数中调用局部对象的构造函数。&& 注:static对象的构造函数永远只调用一次。析构函数顺序为:&& 1. 退出函数时,执行函数内构造的automatic对象的析构函数,注:static对象不析构;&2. main函数中按构造的逆序析构automatic对象;&& 3. 调用函数中定义的static对象的析构函数;&& 4. 调用main中定义的static对象的析构函数;&& 5. 最后调用全局对象的析构函数。注:复合中的构造、析构顺序&&&& 构造:按声明对象的顺序来构造成员对象,而不是按照构造函数成员初始值列表中列出的顺序;而且在包含它们的类对象(宿主对象)被构造之前构造。即:由内向外构造。&&& 析构:按对象构造的逆序析构。对于复合对象,先析构主对象,再析构其包含的对象。
#################22 .so文件是什么文件.so是unix的动态连接库,是二进制文件,作用相当于windows下的.dll文件
###################23& 如何输入空格使用gets,不使用scanf,scanf把空格当作结束符,无法输入。
###################24 参数对等关系const char *与数组名,与字符串
###################25 类对象大小与类大小的区别类是数据类型;类对象是类的一个实例。一个类对象所占据的内存空间由他的数据成员所占据的空间总和所决定,类的成员函数不占据类对象的内存空间;类的空间大小则要包括所有的空间大小了,而且只有在实例化后才分配内存空间。class A{&&& virtual void foo();//导致类里面有一个指向虚拟函数的指针vptr(虚拟函数表指针),4个字节&&&&&&};// sizeof(A) = 12class B :public A{&&& void foo1();&&&&&& long&&} ;//sizeof(B) = 16 class C : virtual public A//导致类里面有一个指向虚拟基类的指针p,4个字节{&&& char sz[10];};//& sizeof(C) = 28如果是32位计算机,则A的大小是:4(int)+4(char与int字节对齐)+4(vptr);B的大小是:4(long)+12(A的大小)=16;C的大小是:A的大小12+C的大小(12+4)=28;如果C虚拟继承多个类,就有多个指针p###################26 关于成员函数C++里类的成员函数和C里的孤立函数在实现机制上基本想同,只是成员函数通过this指针操作对象的成员变量而已,例如a.fun()是通过fun(a.this)来调用的,this指针指向一个table,table里面记录的各个成员函数的地址(当然不同的编译可能略有不同的实现)。所以我们访问成员函数是间接获得地址的。所以这样也就增加了一定的时间开销,这也就是为什么我们提倡把一些简短的,调用频率高的函数声明为inline形式。。
###################27 C++标准问题&iostream&包含了一系列模板化的I/O类,相反地 &iostream.h&只仅仅是支持字符流。另外,输入输出流的C++标准规范接口在一些微妙的细节上都已改进,因此,&iostream&和 &iostream.h&在接口和执行上都是不同的。最后, &iostream&的各组成都是以STL的形式声明的,然而 &iostream.h&的各组成都是声明成全局型的。因为这些实质上的不同,你不能在一个程序中混淆使用这两个库。做为一种习惯,在新的代码中一般使用 &iostream&,但如果你处理的是过去编写的代码,为了继承可以用继续用 &iostream.h&旧保持代码的一致性。在 C++ 标准化的过程中, C++ Standard Library headers的文件名, 全部都不含 file extension. 同时, 所有的名字都放在 'std' 这个 namespace 里面.如果可能的话, 不要用 VC++6.0。 6.0版出来的时候, C++还没标准化. 6.0 的 C++ Standard Library 是老标准的版本,存在很多的 bug.VC++ 7.1版以后已经遵循了标准化!///////////////////&iostream&表示你使用的是标注命名空间,也就是在程序开始应该有这么一句话这是遵循c++标准的&iostream.h&则没有遵循c++标准&string.h&是旧的C头文件,对应的是基于char*的字符串处理函数;&string&是包装了std的C++头文件,对应的是新的strng类;&cstring&是对应旧的C头文件的std版本。
#####################28 gdb调试中查看局部变量为什么显示No symbol "q" in current context.不再同一个文件中,变量作用域已经结束,当然找不到
#####################29 double free or corruption (fasttop): 0x ***内存释放两次引起的
########################30 字符串常量存在静态数据区,可以称之为一个无名的静态变量。#include &stdio.h&//返回的是局部变量的地址,该地址位于动态数据区,栈里char *s1(){&&& char p[]="Hello world!";&&& printf("in s1 p=%p\n", p);&&& printf("in s1: string's address: %p\n", &("Hello world!"));&&&}//返回的是字符串常量的地址,该地址位于静态数据区char *s2(){&&& char *q="Hello world!";&&& printf("in s2 q=%p\n", q);&&& printf("in s2: string's address: %p\n", &("Hello world!"));&&&}//返回的是静态局部变量的地址,该地址位于静态数据区char *s3(){&&& static char r[]="Hello world!";&&& printf("in s3 r=%p\n", r);&&& printf("in s3: string's address: %p\n", &("Hello world!"));&&&}函数返回时,先将返回值存入寄存器,然后释放局部变量空间,最后ret.返回局部变量没问题& & 如果返回局部变量有问题,函数的意义还有吗?& 全局变量还用返回吗?& 返回指向局部变量的指针才有问题,& & 函数退栈之后,局部变量消失,& 指针将指向未知区域,所以出现问题。返回局部变量的引用也是绝对不可以的。& & 引用只是变量的一个别名,变量本体都不存在了,引用当然也没有任何意义。& 还有,如果是堆空间,可以返回& & 即在函数中用new申请的空间,是可以返回的,& 但是一般的情况下,好的风格是:& 尽量在同一个作用域内成对使用new&& 和delete,(也即不要返回堆空间)&& 因为如果不是这样,会是你的函数的接口变的不够灵活,& 试想每个调用你的函数的人还需要记得去delete掉你在函数中new的堆空间,& 否则就会造成内存泄露。
std::vector&int&&& test2()& & {& &&&&&&&&& vecInt&& m_&&&&&&&&& &&&&&&&&& m_vecint.push_back(2);&& //这种基本类型构造,vector的allocator会自动分配空间存储& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //没问题局部变量被销毁,内部依然存在一份copy&& sample& &&&&&&&&& return&& m_& & }& & 然而对于array却是不同的&&& & std::vector&int*&&& test2()& & {& &&&&&&&&& int&& a[10]&& =&& {0};& &&&&&&&&& vector&int*&&& m_&&&&&&&&& &&&&&&&&& m_vecint.push_back(a);&&&& //此时返回后就会出现你说的问题局部变量被释放& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //push指针管理区域无效& &&&&&&&&& return&& m_& & }&&
class&&&&&& & a&& fun()& & {& &&&&&&& a&&& &&&&&&& return&&& & }& & 这返回的是个临时对象,是对象o的拷贝,如果有拷贝构造函数(你可以建一个拷贝构造函数),你可以看得出来。& & o是局部变量,但返回的不是o本身,所以没有问题。& & 但是如果写成:& & a&&& fun()& & {& &&&&&&& a&&& &&&&&&& return&&& & }就不行了。
#########################31 Debug正确,release不正确, 一般都是优化的问题吧
#########################32& effective C++认为基类析构函数一定要虚函数,否则不会析构
#########################33 setvbuf和setbuf有没有作用?Controls stream buffering and buffer size.
setbuf和setvbuf修改的缓冲是标准IO库的缓冲,缓冲一共3种:全缓冲、行缓冲、不缓冲. 默认情况终端输出为行缓冲,标准错误输出为不缓冲,文件IO操作为全缓冲.如果你内存大,就可以把buf弄大点,减少磁盘IO的次数,从而获得更好的效率.
如果在一个读写频繁的程序里,经常seekg/seekp.那你认为缓冲区大小对性能没有一点帮助?如果单纯的读写磁盘,顺序的,台式机硬盘一般一次读写8K(具体数字忘了)是最快的.那缓冲区太大,也的确没多大效果.std::fstream处理起来确实慢。setvbuf很有用,在大量的读写中可以有效的提高效率。 std::fstream在默认情况下,比FILE*慢,在debug情况下更慢。因为std::fstream对buf操作比较多,函数调用比较多,这个问题在release模式下可以解决。其次std::fstream如果对buf调整得当,跟fwrite不相上下,甚至更快。std::fstream怎么调整buf?那个setbuf似乎设置了无用。所以我现在基本上坚持 用FILE *,fopen,或者用CFile ofs.rdbuf()-&pubsetbuf()这个要看具体情况。比如我这里,release模式 一次写16 K数据不设置的情况是std::ofstream = 0.273 msfwrite = 0.077 ms设置8K bufstd::ofstream = 0.184 msfwrite = 0.069 ms设置16 K bufstd::ofstream = 0.060 msfwrite = 0.069 ms
############################34 如何去除文件中的标点FILE * char* fpBuffer = NULL;fp = fopen("list.txt","r"); fscanf(fp,"%s",fpBuffer);1&&& char szId[32] = { 0 };char szName[32] = { 0 };char szPhone[32] = { 0 };sscanf(fpBuffer, "%s,%s,%s", szId, szName, szPhone);2char seps[]&& = ",";char szId[32] = { 0 };char szName[32] = { 0 };char szPhone[32] = { 0 };char *token = NULL;token=strtok(fpBuffer,seps);&& while(token!=NULL)&&&&&&& {&&&&&&&&&&& ++i;&&&&&&&&&&& switch(i)&&&&&&&&&&& {&&&&&&&&&&&&&&& case 1:&&&&&&&&&&&&&&& strcpy(szId,token);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case 2:&&&&&&&&&&&&&&&&& strcpy(szName,token);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case 3:&&&&&&&&&&&&&&&&& strcpy(szPhone,token);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& default:&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&& token = strtok(NULL,seps);&&&&&&& }
############################35& linux多进程退出问题kill 进程号 发送的是 SIGTERMkill -9 进程号 发送的是 SIGKILL主进程被kill掉后,子进程的父进程就是成pid为1的init进程kill 进程号 发送的是 SIGTERM&&& --SIGTERM这个是默认信号值杀死进程就是 kill -9 进程号&&& --等同与KILL -KILL 进程号& 所有的信号都是整型值,也可以用类似SIGKILL这样的宏来代替,如果记不住整型值,就用SIG后面的单词就行了。& 如 kill -9 PID== kill -KILL PID怎么释放子进程?--这个你不用担心 ,主进程退出了& 子进程由init托管,会自动释放的。倒是子进程先于主进程退出了比较麻烦。(可以google一下僵尸进程的问题)如果你一定要作什么特殊的清理工作,就在主进程收到信号后调用自己的信号捕捉器(sigin或者sigaction函数的指针) 子自己的捕捉器里写你要实现的东西。如果你非要在主进程退出前干掉所有的子进程,& 那就在主进程收到信号后在向所有子进程发信号吧。很多信号的默认捕捉器都是终止进程,可以查查,呵呵。
#############################36& (int*)*((int*)*((int*)&f))class father{};
debug下,函数名的值以及函数指针变量的值不是函数的代码的起始地址,函数名的值对应的地址里是一条jmp指令,是无条件跳转到函数的代码的起始地址出。所以&father::test和(int*)*((int*)*((int*)&f))值不必一样,只要其对应的地址里的jmp指令都能跳转到test起始代码处就行。realse下,函数的值以及函数指针变量的值则是是函数的代码的起始地址,所以&father::test和(int*)*((int*)* ((int*)&f))值可能一样,(int*)*((int*)*((int*)&f))的值是test函数的代码的起始位置,关键是编译器如何解析的&father::test了。以上分析基于vc2005~~~,lz还是自己反汇编分析下吧。
//(int*)*( (int*)*( (int*)&f) ) int *pfather = (int*)&f;&&&&&&& //将father对象作为整型指针数组int *pvtable = (int*)*(pfather);&&& //取其第一元素,即虚表地址,存储了虚函数指针int *pvfun = (int*)*&&&&&&& //取虚表第一元素,即虚表第一个虚函数指针void (*vf)() = (void(*)())* //转换为函数指针vf();&&&&&&&&&&&&&&&&&&& //调用该函数
#################################37& 在程序中一用fork,收到的数据中的中文和标点部分就全是乱码,为什么呢?加在while(1)中了,恐怖,随后死机。
############################38 linux中选用的定时方法一usleep二selecttv.tv_sec = nStv.tv_usec = uSint nRetVal = select( NULL , 0 , 0 , NULL , &tv ); 三修改系统时间中断四ualarm五#include &sys/time.h&&&&&& int gettimeofday(struct timeval *tv, struct timezone *tz); 六alarm()然后用single捕捉信号,调用你的发送函数七void set_timer(){&&&&&&& struct itimerval itv,&&&&&&& itv.it_interval.tv_sec = 5;&&&&&&& itv.it_interval.tv_usec = 0;&&&&&&& itv.it_value.tv_sec = 5;&&&&&&& itv.it_value.tv_usec = 0;
&&&&&&& setitimer(ITIMER_REAL, &itv, &oldtv);}
void sigalrm_handler(int sig){&&&&&&& count++;&&&&&&& printf("timer signal.. %d\n", count);}
int main(){&&&&&&& signal(SIGALRM, sigalrm_handler);&&&&&&& set_timer();&&&&&&& while (count & 1000)&&&&&&& {}&&&&&&& exit(0);} ############################39&& scalar object ‘pdata’ requires one element in initializer千里之行 始于足下精诚所至 金石为开
欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 2108 人关注过本帖
标题:vc调试弹出窗口啊
等 级:论坛游民
帖 子:25
专家分:25
结帖率:50%
&&已结贴√
&&问题点数:5&&回复次数:7&&&
vc调试弹出窗口啊
在调试时,它弹出窗口阻止我继续调试,无语,
附图/a2659633/pic/item/052e8dda502779.jpg
在当前目录中存在文件名为&case1.in&(其中case后为数字1,不是字母l,写错提交后会判错)的文本文件,
其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计文章中每个单词出现的次数,
并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,
不足5个单词时,按序输出全部单词)。程序中注意如下细节:
(1)&&& 空格、标点符号与回车符起到分隔单词的作用。
(2)&&& 文章一行的末尾可能有连字符,出现连字符时,该行最末的字符串与下行最先出现的字符串构一个单词;
(3)&&& 名词缩写算一个单词;
(4)&&& 数字不算单词;
(5)&&& 单词不区分大小写;
(6)&&& 输出时单词全使用小写;
附代码,代码有错误,但代码的错误不影响调试吧,
#include&stdio.h&
#include&string.h&
char word[];
int num[10001];
&&& FILE *
&&& int x=0,y,last,i=0,newword=0,t,q,j=0;
&&& fp=fopen(&case1.in&,&r&);
&&& while((ch=fgetc(fp))!=EOF)
&&&&&&&&if('A'&=ch&&ch&='Z') ch=ch+32;
&&&&&&&&&&&&if('a'&=ch&&ch&='z'||'0'&=ch&&ch&='9')
&&&&&&&&&&&&{
&&&&&&&&&&&&&&& if(newword)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&for(q=0;q&i;q++)
&&&&&&&&&&&&&&&&&&&&&&&&if(strcmp(word[q],word[i])==0)
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&& num[q]++;i--;
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&i++;j=0;newword=0;
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& word[i][j++]=
&&&&&&&&&&&&}
&&&&&&&&&&&&else {word[i][j++]='\0';newword=1;}
&&&&&&&&for(t=0;t&i;t++) printf(&%d\n&,num[t]);//中途查看num的值;
&&&&&&&&//接下来要对num[]排序及处理num相同按字母排序的情况
重点是干嘛弹那种窗口???
[ 本帖最后由 a2659633 于
18:07 编辑 ]
搜索更多相关主题的帖子:
等 级:蜘蛛侠
帖 子:486
专家分:1185
你的代码发来看看
免费赠送河蟹一只
等 级:蜘蛛侠
帖 子:486
专家分:1185
你的文件去哪了,编译器要求你输入文件路径
免费赠送河蟹一只
等 级:论坛游民
帖 子:25
专家分:25
就是你们调试时没有试过这种恶心情况吗?
我知道,人格可以鄙视人民币,但是人民币可以打败人格。
等 级:蜘蛛侠
帖 子:486
专家分:1185
回复 4楼 a2659633
我调试没有问题
附件: 您没有浏览附件的权限,请
免费赠送河蟹一只
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
摆杜的图看不了
天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
等 级:论坛游民
帖 子:25
专家分:25
先谢谢大家的热心回答,不过会出现这种对话框究竟是什么意思?
它要求“please enter the path for stlren.asm” “please enter the path for crt0.c”就是5楼的那个图~~
怎么要输入这种东西?因为代码编译和连结都没错误,所以代码排除语法错,我就是想调试语义错误而已~~
而且那种对话框(5楼的那个),选择跳到汇编那里
附件: 您没有浏览附件的权限,请
我知道,人格可以鄙视人民币,但是人民币可以打败人格。
等 级:论坛游民
帖 子:25
专家分:25
调多了几次,知道怎么回事了,因为我调试一直是按step into 所以它要求进入那些fgetc,strlen之类的无关函数,就要求输入路径,为避免进入无关函数,应按step over,点disassembly切换汇编和普通窗口。
还是要谢谢热心回答的人
我知道,人格可以鄙视人民币,但是人民币可以打败人格。
版权所有,并保留所有权利。
Powered by , Processed in 0.019669 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved}

我要回帖

更多关于 linux 汇编调试 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信