C++

调试时常用函数

C++调试时常用的函数

刚接触程序调试时,经常会程序执行完后,一闪而过,而执行后的结果还没来得及看。

  • 涉及到OpenCV中的图像算法调试时,用waitKey()函数,但是用该函数前必须要有imshow函数,因为waitKey函数只有在有imshow图像的条件下起作用。如下所示:

    imshow(“原图”, src);
    waitKey();

  • 对于通常的c/c++程序调试时,
    解决办法如下:

    法1:Ctrl+F5执行
    法2:调试菜单中选择“开始执行(不调试)”进行执行

上述两种方法的效果其实是一样的,都会在程序执行的cmd窗口显示出“请按任意键继续…”

  • 法3:用以下介绍的几个函数

1、_getch() 或getch() (一般用前者)

需包含头文件#include <conio.h>

需要包含的头文件:conio.h 函数用途:按下一个键,将会从控制台读取该字符,但不显示在屏幕上。
如果不按键该函数不返回
getch函数暂停程序运行,当按任意键后程序继续运行

getchar()函数getch()函数区别:

(1)getchar():从键盘读取一个字符并输出,该函数的返回值是输入第一个字符的ASCII码;若用户输入的是一连串字符,函数直到用户输入回车时结束。
(2)getch():接受一个任意键的输入,不用按回车就返回。该函数的返回值是所输入字符的ASCII码,且该函数的输入不会自动显示在屏幕上,需要putchar()函数输出显示。
(3)getchar();和getch();的另一个区别就是所需要包含的头文件不同。
getchar():用#include<stdio.h>
getch():用#include<conio.h>

_getch() 和 getch() 有什么区别:

(1)带下划线_的函数一般是函数库内部的函数,而不带下划线的一般是提供给用户使用的函数。带下划线的目的是为了防止用户定义的函数和函数库的函数重名冲突,所以直接使用也是可以的。
(2)_T这类似的是宏定义转换,转换成函数参数相符合的类型,如果没有,编译器一般可以自动转换成需要的类型,但是严格一些的编译器就会给你报错,我就遇到了在VS2008中没有用TEXT()转换而报错的情况。

一般用_getch()和_kbhit()形式

1
str.Format(_T("Floating point: %.2f\n"), 12345.12345);

2、_kbhit() 或kbhit()(一般用前者)
需包含头文件#include <conio.h>


kbhit(),kb就是键盘,hit是按击

kbhit()表示有按键按下,返回非零值

3、C语言中system(“pause”)
需包含头文件#include<stdio.h>或#include


作用相当于按任意键继续,会等待用户按一个键,然后继续执行

4、C语言中Sleep函数
需包含头文件#include<stdio.h>


功能:程序挂起一段时间再执行
用法:Sleep(时间)
头文件:Windows下为–> windows.h
Linux 下为 –> unistd.h

注意:
(1)Sleep是区分大小写的,有的编译器是大写,有的是小写。
(2)Sleep括号里的时间,在windows下是已毫秒为单位,而Linux是以秒为单位

示例:

C++语言:

#include <iostream>
#include <windows.h> 
using namespace std;
int main()
{
    while(!kbhit()) //当没有键按下
    {
    cout<<"无键按下"<<endl;
    }
    cout<<"有键按下"<<endl;

    int a = 1;  
    while (a)  
    {  
        printf("Welcome to songjiahao's blog\n");  
        Sleep(1000);  
    }  
    system("pause");  
    return 0;  
}

C语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main(void)
{
char ch;
while(ch!=27)
{
printf("HelloWorld\n");
if(kbhit())
ch=getch();
}
printf("End!\n");
system("pause");
return 0;
}