语音识别
er.xml
<?xml version="1.0" encoding="utf-8"?> <GRAMMAR LANGID="804"> <DEFINE> <ID NAME="CMD" VAL="10"/> </DEFINE> <RULE NAME="COMMAND" ID="CMD" TOPLEVEL="ACTIVE"> <L> <P>资源管理器</P> <P>打开企鹅</P> <P>关闭企鹅</P> <P>关机</P> <P>重启</P> <P>记事本</P> <P>计算器</P> <P>画图板</P> <P>谭胜</P> </L> </RULE> </GRAMMAR>
yuyin.cpp
#include <windows.h> #include <atlstr.h> #include <sphelper.h> #include <sapi.h> #include<comutil.h> #include<string.h> #include<stdlib.h> #pragma comment(lib,"sapi.lib") #pragma comment(lib, "comsupp.lib") #define GID_CMD_GR 333333 #define WM_RECOEVENT WM_USER+1 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); char szAppName[] = "TsinghuaYincheng"; BOOL b_initSR; BOOL b_Cmd_Grammar; CComPtr<ISpRecoContext>m_cpRecoCtxt; //语音识别程序接口 CComPtr<ISpRecoGrammar>m_cpCmdGramma; //识别语法 CComPtr<ISpRecognizer>m_cpRecoEngine; //语音识别引擎 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow) { HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.cbClsExtra =0; wndclass.cbWndExtra =0; wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor =LoadCursor(NULL,IDC_ARROW); wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION); wndclass.hInstance =hInstance; wndclass.lpfnWndProc =WndProc; wndclass.lpszClassName =szAppName; wndclass.lpszMenuName =NULL; wndclass.style =CS_HREDRAW|CS_VREDRAW; if(!RegisterClass(&wndclass)) { MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR); return 0; } hwnd=CreateWindow(szAppName, TEXT("传智播客C/C++学院语音识别教程"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch(message) { case WM_CREATE: { //初始化COM端口 ::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED); //创建识别引擎COM实例为共享型 HRESULT hr=m_cpRecoEngine.CoCreateInstance(CLSID_SpSharedRecognizer); //创建识别上下文接口 if(SUCCEEDED(hr)) { hr=m_cpRecoEngine->CreateRecoContext(&m_cpRecoCtxt); } else MessageBox(hwnd,TEXT("error1"),TEXT("error"),S_OK); //设置识别消息,使计算机时刻监听语音消息 if(SUCCEEDED(hr)) { hr=m_cpRecoCtxt->SetNotifyWindowMessage(hwnd,WM_RECOEVENT,0,0); } else MessageBox(hwnd,TEXT("error2"),TEXT("error"),S_OK); //设置我们感兴趣的事件 if(SUCCEEDED(hr)) { ULONGLONG ullMyEvents=SPFEI(SPEI_SOUND_START)|SPFEI(SPEI_RECOGNITION)|SPFEI(SPEI_SOUND_END); hr=m_cpRecoCtxt->SetInterest(ullMyEvents,ullMyEvents); } else MessageBox(hwnd,TEXT("error3"),TEXT("error"),S_OK); //创建语法规则 b_Cmd_Grammar=TRUE; if(FAILED(hr)) { MessageBox(hwnd,TEXT("error4"),TEXT("error"),S_OK); } hr=m_cpRecoCtxt->CreateGrammar(GID_CMD_GR,&m_cpCmdGramma); WCHAR wszXMLFile[20]=L"yuyinliebiao.xml"; MultiByteToWideChar(CP_ACP,0,(LPCSTR)"yuyinliebiao.xml",-1,wszXMLFile,256); hr=m_cpCmdGramma->LoadCmdFromFile(wszXMLFile,SPLO_DYNAMIC); if(FAILED(hr)) { MessageBox(hwnd,TEXT("error5"),TEXT("error"),S_OK); } b_initSR=TRUE; //在开始识别时,激活语法进行识别 hr=m_cpCmdGramma->SetRuleState(NULL,NULL,SPRS_ACTIVE); return 0; } case WM_RECOEVENT: { RECT rect; GetClientRect(hwnd,&rect); hdc=GetDC(hwnd); USES_CONVERSION; CSpEvent event; while(event.GetFrom(m_cpRecoCtxt)==S_OK) { switch(event.eEventId) { case SPEI_RECOGNITION: { static const WCHAR wszUnrecognized[]=L"<Unrecognized>"; CSpDynamicString dstrText; //取得识别结果 if(FAILED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE,SP_GETWHOLEPHRASE,TRUE,&dstrText,NULL))) { dstrText=wszUnrecognized; } BSTR SRout; dstrText.CopyToBSTR(&SRout); char* lpszText2 = _com_util::ConvertBSTRToString(SRout); if(b_Cmd_Grammar) { if (strstr("资源管理器",lpszText2)!=NULL) { system("C:\\"); DrawText(hdc,TEXT("资源管理器"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER); } if (strstr("打开企鹅",lpszText2)!=NULL) { system("\"C:\\Program Files\\Tencent\\QQ\\QQProtect\\Bin\\QQProtect.exe\""); DrawText(hdc,TEXT("打开企鹅"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER); } if (strstr("关闭企鹅", lpszText2) != NULL) { system("taskkill /f /im QQ.exe"); DrawText(hdc, TEXT("关闭企鹅"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); } if (strstr("关机", lpszText2) != NULL) { system("shutdown -s -t 1200"); DrawText(hdc, TEXT("关机"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); } if (strstr("重启", lpszText2) != NULL) { system("shutdown -r -t 1200"); DrawText(hdc, TEXT("重启"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); } if (strstr("记事本", lpszText2) != NULL) { system("notepad"); DrawText(hdc, TEXT("记事本"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); } if (strstr("计算器", lpszText2) != NULL) { system("calc"); DrawText(hdc, TEXT("计算器"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); } if (strstr("画图板", lpszText2) != NULL) { system("mspaint"); DrawText(hdc, TEXT("画图板"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); } if (strstr("谭胜", lpszText2) != NULL) { DrawText(hdc, TEXT("这是一个猥琐男"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); } } } } } return TRUE; } case WM_PAINT: hdc=BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wParam,lParam); }
Const关键字
Const int *p; int const *p;
const *地址不可以修改
int *const p;
*const指向的数据不可修改
#include <stdio.h> void main01() { int num = 10; //const int data; //data = 20; const int data = 20;//const 修饰的变量,只能在初始化的时候进行赋值操作 getchar(); } //const在*左侧,地址本身不可以修改,可以改变指针指向。只能读不能写 void main02() { int num = 10; const int data = 20; //const int *p;//等价于int const *p; int const *p; p = # printf("%d\n", *p); p = &data; printf("%d\n", *p); //*p = 30;// getchar(); } //const在*右侧,指向的数据不可修改 void main() { int num = 10; const int data = 20; int *const p = #//只能在初始化的时候,指定唯一的指向 //int *const p; //p = # printf("%d\n", *p); //p = &data; *p = 30; printf("%d\n", *p); getchar(); } void main04() { int num = 10; const int data = 20; const int *const p = # printf("%d\n", *p); //*p = 30; //p = &data; getchar(); }
字符串应用
#define _CRT_SECURE_NO_WARNINGS //关闭安全检查 #include<stdio.h> #include<stdlib.h> #include<string.h> #include <Windows.h> void main1() { //char str[100] = "for /l %i in (1,1,5) do calc"; //char *p = "for /l %i in (1,1,5) do calc"; //str[0] = ' '; str是数组,存储的是字符串每一个字符 //*p = ' ';p是一个指针,存储字符串的地址 char str[100] = { 0 }; //printf("for /l %%i in (1,1,%d) do %s",5,"calc"); int num; char op[30] = { 0 }; scanf("%d%s", &num, op); sprintf(str, "for /l %%i in (1,1,%d) do %s", num, op); system(str); system("pause"); } void main2() { char str[100] = { 0 }; char op[30] = { 0 }; scanf("%s", op); sprintf(str, "taskkill /f /im %s", op); system(str); system("pause"); } void main3() { system("tasklist"); for (int i = 0x0; i <= 0xf; i++) { char str[30] = { 0 };//存储指令 sprintf(str, "color %x%x", i,0xf-i);//打印指令 system(str);//变色 Sleep(500); } } void main4() { char str[100] = "我有1000元"; int num; sscanf(str, "我有%d元", &num); printf("%d", num); system("pause"); } void main5() { //printf("%.6s\n", "1234.abcd"); char str[100] = "notepad8888"; char newstr[100] = ""; sprintf(newstr, "%.s", str); system(newstr); system("pause"); } void main6() { char str1[100] = "note"; char str2[100] = "pad"; //system(str1 + str2); char str3[100] = { 0 }; sprintf(str3, "%s%s", str1, str2);//字符串相加 system(str3); } void main7() { //printf("%.6s", "1234.abcd"); char str[100] = "notepad8888"; char newstr[100] = ""; sprintf(newstr, "%-10.7s", str);//10宽度,+宽度范围内右边对齐,-左边对齐,.7从左往右挖去7个字符 printf("[%s]", newstr); system(newstr); system("pause"); } int mystrlen(char* str) { int i = 0; for (char*p = str; *p != '\0'; p++) { i++; } return i;//实现字符串统计 } int mystrlenA(char* str) { char *p = str; int i = 0; AAA: if (*p!='\0') { i++; p++; goto AAA; } return i; } int mystrlenB(char *str) { if (*str=='\0') { return 0; } else { return 1 + mystrlenB(++str); } } void main8() { char str[100] = "china is good"; printf("%d", sizeof(str));//求数组缓冲区长度 printf("\n%d", mystrlen(str));//从开头第一个字符到\0字符 printf("\n%d", mystrlenA(str));//从开头第一个字符到\0字符 printf("\n%d", mystrlenB(str));//从开头第一个字符到\0字符 getchar(); } void main9() { char str1[100] = "my name is yincheng"; char str2[30] = "chen"; char *p = strstr(str1, str2); if (p == NULL) { printf("没有找到"); } else { printf("找到%p,%c, %s", p, *p, p); } getchar(); }
内存分配以及处理海量数据
#include<stdio.h> #include<stdlib.h> // m, n生成一个数组,m行 n列 void main() { int *p =(int*) malloc(sizeof(int)* 40);//一维数组 for (int *px = p,i=0; px < p + 40; px++,i++)// { *px = i;//赋值 printf("%d,%p\n", *px, px);//指针循环 } //int b[5][8]; printf("\n\n\n"); int(*pp)[8] = (int(*)[8]) p;//指针类型决定了访问的方式 for (int i = 0; i < 5; i++) { for (int j = 0; j < 8; j++) { //printf("%5d", pp[i][j]);//打印数据 printf("%5d", *(*(pp + i) + j));// pp[i][j] } printf("\n"); } //a [4][2][5] printf("\n\n\n"); int(*ppp)[2][5] = (int(*)[2][5])p; for (int i = 0; i < 4; i++) { for (int j = 0; j < 2; j++) { for (int k = 0; k < 5; k++) { //printf("%5d", ppp[i][j][k]);//打印元素 printf("%5d", *(*(*(ppp + i) + j) + k)); } printf("\n"); } printf("\n\n\n"); } system("pause"); }
#define _CRT_SECURE_NO_WARNINGS //关闭安全检查 #include<stdio.h> #include<stdlib.h> #include<string.h> char **pp=NULL;//存储指针数组的地址 //13180807 *4 /1024/1024 50M void initdatatomem(char *path) { pp = (char **)malloc(sizeof(char *)* 13180807);//分配指针数组 FILE *pf = fopen(path, "r"); if (pf == NULL) { printf("fail"); } else { for (int i = 0; i < 13180807; i++) { char str[275] = {0};//读取字符串的缓冲区 fgets(str, 275, pf);//从文件中逐行读取字符串 int strlength = strlen(str) + 1;//获取要分配的字符串长度 char *px =(char *) malloc(sizeof(char)*strlength);//分配内存 strcpy(px, str);//拷贝字符串 px[strlength - 1] = '\0';//设定最后一个字符为'\0' pp[i] = px;//存储字符串的首地址到指针数组 } } printf("载入内存OK\n"); } void findstr(char *searchstr) { for (int i = 0; i < 13180807; i++) { //pp[i];//是一个指针 char *ptemp = strstr(pp[i], searchstr);//遍历所有的指针数组的地址,字符串查找 if (ptemp != NULL) { printf("\n%s", pp[i]);//打印字符串 } } } int getfilesize(char *path) { FILE *pf;//文件指针 pf = fopen(path, "r");//读取的模式打开 if (pf == NULL) { return -1;//代表获取失败 } else { fseek(pf, 0, SEEK_END);//到文件末尾 int num = ftell(pf);//文件开头到当前位置有多少个字节 fclose(pf);//关闭文件 return num; } } int getn(char *path) { FILE *pf;//文件指针 pf = fopen(path, "r");//读取的模式打开 if (pf == NULL) { return -1;//代表获取失败 } else { int i = 0; while (!feof(pf))//是否到文件末尾 { char str[275]; fgets(str, 275, pf);//读取一行 i++;//统计行数 } fclose(pf);//关闭文件 return i; } } void main() { /*char *path = "C:\\Users\\yincheng01\\Desktop\\old\\dangdangwang.txt"; int num = getfilesize(path); printf("%d字节,%fK,%fM", num, num / 1024.0, num / 1024.0 / 1024.0); printf("\n有%d行", getn(path));*/ char *path = "C:\\Users\\yincheng01\\Desktop\\old\\dangdangwang.txt"; initdatatomem(path); while (1) { char searchstr[100] = { 0 }; scanf("%s", searchstr); findstr(searchstr); } system("pause"); }
版权声明:本博客所有文章均为原创,欢迎交流,欢迎转载;转载请勿篡改内容,并且注明出处,谢谢!
时间: 2024-10-05 05:01:59