读书人

刚学编程问个有关问题 如何退出多层

发布时间: 2012-09-14 23:00:48 作者: rapoo

刚学编程,问个问题 怎么退出多层循环语句?

C/C++ code
#include <windows.h>#include <tlhelp32.h> #include <stdio.h>#include <stdlib.h>BOOL FindModules(){    HANDLE             hProcessSnap;    PROCESSENTRY32     pe32;        HANDLE             hModuleSnap;    MODULEENTRY32      me32;        //对系统中当前所有的进程拍下快照     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);        //在使用 PROCESSENTRY32 结构之间需要先设置好该结构的大小     pe32.dwSize = sizeof(PROCESSENTRY32);     //获取第一个进程     Process32First(hProcessSnap, &pe32);        //采用 Do - While 遍历所有进程     do    {        //printf("\n-----------------------------------------------------");        printf("\n  PROCESS NAME:     = %s", pe32.szExeFile);        printf("\n  PROCESS ID        = %d", pe32.th32ProcessID);                //给进程所引用的模块信息设定一个快照         hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID);        me32.dwSize = sizeof(MODULEENTRY32);         Module32First(hModuleSnap, &me32);                    do        {            if(strcmp(me32.szModule,"termsrv.dll")==0)            {              printf("\n\n  发现MODULE NAME: termsrv.dll     in    process ID:%d\n" ,me32.th32ProcessID);              CloseHandle(hModuleSnap);              CloseHandle(hProcessSnap);              return 0;   \\为了第一时间找到模块后退出 我在此就用了return。            }                    } while(Module32Next(hModuleSnap, &me32));                //遍历获取下一个进程     } while(Process32Next(hProcessSnap, &pe32));  \\上面添加return后能达到目的 但编译有警告 是在此处没返回值。刻意在此加个return吧 虽然不执行 但感觉像是在拼凑。}                       \\有啥其他方法吗? 如果不用goto。。。 用了会被笑话的。。。int main(){      //system("@color 73&&cls");      FindModules();      //system("pause");}


[解决办法]
\\上面添加return后能达到目的 但编译有警告 是在此处没返回值。刻意在此加个return吧 虽然不执行 但感觉像是在拼凑。

这里应该有retrun,而且也不是执行不到的
简单是用goto,多重循环跳出用goto是可以的
或者加个变量,退出时置为true,每层循环都检测,

[解决办法]
这样不好!hProcessSnap的句柄都没有关闭。
可以另外设一个退出标志BOOL bContinue = TRUE ;
在你的if中确认需要退出时把它赋值为FALSE,同时删除if中的return,然后你的两个循环判断改为:
while(Module32Next(hModuleSnap, &me32)&&bContinue)
while(Process32Next(hProcessSnap, &pe32)&&bContinue)
在函数最后加上:
CloseHandle(hProcessSnap);
return 0 ;

[解决办法]
outflag = true;
break;
//return 0; \\为了第一时间找到模块后退出 我在此就用了return。 }
} while(Module32Next(hModuleSnap, &me32));

} while(!outflag && Process32Next(hProcessSnap, &pe32));
[解决办法]
你这个返回值有什么用?能返回的都是0
直接改成void FindModules()
return 0;改为return;不就没警告了。
[解决办法]
个人二楼的方法比较好,多添加一个变量。
在内部要return 的地方,使用 break 语句跳出while循环。

在函数的最后检查hProcessSnap等是否已经关闭。
[解决办法]
其实你应该把你的返回值作为成功失败的反馈,或是ErrorCode的返回,可以让上一层知道函数的执行情况,这样通用性好一些
[解决办法]
代码的一个重要的要求就是要便于人理解,包括别人和自己

所以:
1)goto是可以用的,只要结构清晰,便于理解;
2)在程序实际运行不可达的地方写上一点代码避免编译器警告是可以的,但你要注释一下,说明原因;


3)既然警告的是没有返回值,你给他一个返回值不就行了?
[解决办法]
哦,不好意思,没有看见,说错了。但是我还是建议这个函数在最后释放资源并且return,因为你的循环中的if判断不一定可以生效,完全有可能直接运行到函数结尾,尽量使代码看起来完整,哪怕你坚信他不会运行到结尾也最好这么做。而且能不用goto就最好不用,这个东西在代码稍微庞大一些的情况下,阅读、修改、维护都可能变得比较麻烦


[解决办法]
if(strcmp(me32.szModule,lpModuleName)==0)
{ ...
CloseHandle(hModuleSnap);
return 2;
}
还是有问题,你不能保证你的if一定可以判定成功,那么你仅仅在这里设置返回和关闭句柄,那么就存在一直没有运行到if里面的情况,这是个程序上的漏洞。
[解决办法]
你怎么知道if(strcmp(me32.szModule,lpModuleName)==0)一定会为真?如果一直都是假怎么办?

读书人网 >C++

热点推荐