C++调试函数的编写

ACM线下赛中,很多时候并不提供很强大的调试软件,这样,如果要想调试查看map或list等信息,需要自行编写输出中间结果。

这里提供一个通用框架,并附上示例,可以作为模板使用,提交代码时注释掉#define YLOFI和#define YDELO即可。

  1 #define YLOFI
  2 #define YDELO
  3
  4 #include<iostream>
  5 #include<iomanip>
  6 #include<cstdio>
  7 #include<string>
  8 #include<sstream>
  9 #include<map>
 10 #include<list>
 11 #include<algorithm>
 12 using namespace std;
 13 #define YCOL1 10
 14 struct yc2d{
 15     int a;
 16     int b;
 17 };
 18
 19 #ifdef YDELO
 20 //#include "YLog.h"
 21 #include "assert.h"
 22 int ydelon = 0;
 23 int ydelom = 0;
 24 //自定义类
 25 ostream &operator<<(ostream &os,const yc2d &myclass){
 26     return os << myclass.a << " " << myclass.b;
 27 }
 28 //二维数组
 29 template<typename T>
 30 void yPrintArr(const T x[][YCOL1]){
 31     int i = 0;
 32     while(1){
 33         cout << i;
 34         for(int j = 0;j<ydelom;j++){
 35             cout << " (" << j << "," << x[i][j] << ")";
 36         }
 37         i++;
 38         if(i >= ydelon){
 39             break;
 40         }
 41         else{
 42             cout << endl;
 43         }
 44     }
 45     return;
 46 }
 47 template<typename T>
 48 bool yPrint(const string &info,const T x[][YCOL1],int n = 0,int m = 0,bool clr = true){
 49     if(clr){
 50         system("cls");
 51     }
 52     cout << endl << "\\**********************" << endl << info << endl;
 53     ydelon = n;
 54     ydelom = m;
 55     if(ydelon > 0 && ydelom > 0){
 56         yPrintArr(x);
 57     }
 58     else{
 59         return false;
 60     }
 61     cout << endl << "**********************\\" << endl;
 62     return true;
 63 }
 64 //数组
 65 template<typename T,int size>
 66 void yPrintArr(const T (&x)[size]){
 67     int i = 0;
 68     while(1){
 69         cout << i << " " << x[i];
 70         i++;
 71         if(i >= ydelon){
 72             break;
 73         }
 74         else{
 75             cout << endl;
 76         }
 77     }
 78     return;
 79 }
 80 template<typename T,int size>
 81 bool yPrint(const string &info,const T (&x)[size],int n = 0,bool clr = true){
 82     if(clr){
 83         system("cls");
 84     }
 85     cout << endl << "\\**********************" << endl << info << endl;
 86     ydelon = n;
 87     if(ydelon > 0){
 88         yPrintArr(x);
 89     }
 90     else{
 91         return false;
 92     }
 93     cout << endl << "**********************\\" << endl;
 94     return true;
 95 }
 96 //非数组
 97 template<typename T>
 98 bool yPrint(const string &info,const T &x,int n = 0,bool clr = true){
 99     if(clr){
100         system("cls");
101     }
102     cout << endl << "\\**********************" << endl << info << endl;
103     ydelon = n;
104     if(ydelon >= 0){
105         cout << x;
106     }
107     else{
108         return false;
109     }
110     cout << endl << "**********************\\" << endl;
111     return true;
112 }
113 //list & map
114 template<typename T,typename S>
115 ostream &operator<<(ostream &os,const pair<T,S> &it){
116     return     os << it.first << " " << it.second;
117 }
118 template<typename T,typename S>
119 ostream &operator<<(ostream &os,const map<T,S> &st){
120     int n = ydelon==0?st.size():ydelon,i = 0;
121     os <<  " size=" << st.size() << " show=" << n << endl;
122     for(typename map<T,S>::const_iterator it = st.begin();it!=st.end();it++){
123         os << i << " " << *it;
124         i++;
125         if(i >= n){
126             break;
127         }
128         else{
129             os << endl;
130         }
131     }
132     return os;
133 }
134 template<typename T>
135 ostream &operator<<(ostream &os,const list<T> &st){
136     int n = ydelon==0?st.size():ydelon,i = 0;
137     os <<  " size=" << st.size() << " show=" << n << endl;
138     for(typename list<T>::const_iterator it = st.begin();it!=st.end();it++){
139         os << i << " " << *it;
140         i++;
141         if(i >= n){
142             break;
143         }
144         else{
145             os << endl;
146         }
147     }
148     return os;
149 }
150 #endif
151
152 int main(){
153     #ifdef YLOFI
154     freopen("yin.txt","r",stdin);
155     //freopen("yout.txt","w",stdout);
156     #endif
157     #ifdef YDELO
158     assert(1);
159     #endif
160     map<int,int> ma;
161     ma[1] = 9;
162     ma[2] = 8;
163     ma[-1] = 7;
164     list<int> li;
165     li.push_back(33);
166     li.push_back(3);
167     int a = 3;
168     double f[10] = {1.1,2.2,3.3,4.4};
169     yc2d myclass;
170     myclass.a = 3;
171     myclass.b = 2;
172     int arr2[4][YCOL1] = {{0,1,2},{2,1,0}};
173     cout << "here could be clear." << endl;
174 #ifdef YDELO
175     assert(yPrint("ma1",ma,2));
176     assert(yPrint("li",li,0,false));
177     assert(yPrint("a",a,0,false));
178     assert(yPrint("f",f,4,false));
179     assert(yPrint("myclass",myclass,0,false));
180     assert(yPrint("arr2",arr2,2,3,false));
181 #endif
182     return 0;
183 }

时间: 2024-10-04 08:25:14

C++调试函数的编写的相关文章

PHP代码审计1-审计环境与调试函数

审计环境与调试函数 审计环境 测试环境 常用集成环境:phpStudy.WampServer #不同的操作系统下,漏洞测试的结果也可能不一样 PHP编写工具 EditPlu Notepad++ 代码审计工具 Seay 代码审计平台 DVWA(注:windows下,需要将配置文件中的password改为空) ZVulDrill (注:需要重新导入数据库文件) 漏洞验证辅助工具 Burp Suite 浏览器扩展(Hack Bar.Firebug.Modify) 正则调试工具 SQL执行监控工具 常用

用户选择,调用相应函数的编写方法

用户选择,调用相应函数的编写方法: 1.先输出Menu菜单,让用户选择. 2.创建一个Menu字典k=序号,v=操作函数 3.调用用户选择的相应序号的函数:menu[option](参数) def account_info(acc_data): print(user_data) def repay(acc_data): pass def withdraw(acc_data): pass def transfer(acc_data): pass def pay_check(acc_data): p

C语言文件操作函数的编写

 编写文件操作的头文件 /************************************************************************** Copyright(C)    :2014-08-5 toto Filename       :file.h Author          :涂作权 Version         :V1.1 Date            :2014-08-05 Description     :文件操作的头文件 Others  

多返回值函数的编写方法

方法一:利用全局变量 注意,该方法虽然可以实现有多个返回值的函数,但是由于全局变量不能保证值的正确性(因为其作用域是全局,所以程序范围内都可以修改它的值,如果出现错误将非常难以发现),并且全局变量增加了程序间模块的耦合,所以该方法要慎用. 方法二:使用数组指针 注意,该方法适用于多个返回值的数据类型一致的情况. 方法三:使用结构体指针 注意,当函数要求返回的多个值是相互关联的,或者返回的多个值数据类型不一致时可以采用该方法. 详细内容请参考:http://blog.csdn.net/suprem

PHP开发中,让var_dump调试函数输出更美观 ^_^#

最近开发发现自己电脑var_dump时候没有如下效果. 果断google.百度下.^_^# 抱歉,没有找到结果.就小小的机智了下,右键查看源码,答案有了.是xdebug带来的福利. 添加xdebug方法如下: 根据自己的PHP版本去下载一个php_xdebug.dll文件. 找到php.ini文件.在末尾添加如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 ; XDEBUG Extension zend_extension = "D:/wamp/bin/php/php5.3.27

Python帮助函数调试函数 用于获取对象的属性及属性值

刚接触Python,上篇 <Python入门>第一个Python Web程序--简单的Web服务器 中调试非常不方便,不知道对象详细有什么属性,包括什么值,所以写了一个函数.用于获取对象的属性及属性值 函数代码例如以下: #调试函数.用于输出对象的属性及属性值 def getAllAttrs(obj): strAttrs = '' for o in dir(obj): strAttrs =strAttrs + o + ' := ' + str(getattr(obj,o)) + '<br

如何实现在线查看进程中的变量以及执行调试函数

本程序实现了查看进程中的全局变量,以及执行进程中的调试函数的功能. 程序运行后,init_symbol函数会创建一个线程,此线程从标准输入读取 用户输入的变量名或函数调用命令,然后输出相应的结果. 例如, 输入 my_var,即可查看变量my_var的信息. 输入 my_func(1, "good", 0x123) 即可使用输入的参数执行函数my_func 目前最大支持8个参数,且每个参数size必须等于sizeof(long) my_func函数的各个入参就是一个符合要求的例子. 输

为下面的函数原型编写函数定义:int ascii_to_integer(char *str)

为下面的函数原型编写函数定义: int ascii_to_integer(char *str); 这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数.如果字符串参数包含了任何非数字字符,函数就返回零.请不必担心算数溢出. 提示:这个技巧很简单:你每发现一个数字,把当前值乘以10,并把这个值和新的数字所代表的值相加.字符指针减去'0'即将其对应的ASCII码值转换为整型. #include <stdio.h> int ascii_to_integer(char

【c语言】为下面的函数原型编写函数定义,这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。

/*为下面的函数原型编写函数定义: int ascii_to_integer(char *str); 这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数. 如果字符串参数包含了任何非数字字符,函数就返回零.请不必担心算数溢出. 提示:这个技巧很简单:你每发现一个数字,把当前值乘以10,并把这个值和新的数字所代表的值相加*/ #include <stdio.h> int ascii_to_integer(char const *str) { int sum =