[英]strstr and StrStrI in MinGW and with function as parameter in C
我有一個奇怪的問題。 我有一個讀取 PCAP 文件的大程序。 現在我想在這個 pcap 文件中進行搜索。 正如我提到的,這個程序真的很大,所以我有很多功能和很多參數等。它是一個 Win32 應用程序,我使用 MinGW。
現在,我想執行一個區分大小寫的搜索( strstr
)或不區分大小寫( StrStrI
從Shlwapi
)取決於哪些用戶在GUI中已選擇。 搜索量相當大,可以設置很多參數。 所以我不想總是問if (caseSensitve) then strstr(...) else StrStrI(...)
,我想在開始時做出決定,我把它寫在一個結構中,這個struct
通過不同的功能。
當我這樣做如下所示我的程序使用3次后停止工作__strstr
當選擇不區分大小寫(因此它將運行StrStrI
)。 選擇__strstr
大小寫__strstr
( strstr
)工作時完美。 但是當我直接使用StrStrI
,它也很完美......
我總是收到來自 Eclipse 的警告:
從不兼容的指針類型賦值 [默認啟用]
但為什么? LPSTR
與char*
相同,不是嗎? 而函數的typedef
返回是char*
?!
這聽起來很復雜,嗯? 這是一個示例代碼。 這正是我的大程序中的編程方式。 要測試它,您需要添加Shlwapi
庫。
/*
* pcap.c
*
* Created on: 05.01.2015
* Author: Max
*/
#include <windef.h>
#include <stdlib.h>
#include <stdio.h>
#include <shlwapi.h>//need to add library shlwapi!
typedef char* (*__StrStr)(const char* str1, const char* str2);
typedef struct _findData {
__StrStr __strstr; //string in string function (either strstr (cs) or StrStrI (ci))
char fCaseSensitve :1;
} findData;
void findDataTest(findData *tFindData);
void findDataTest2(findData *tFindData);
char * Test1 = "HELLO";
char * Test2 = "lo";
int main() {
findData *tFindData = malloc(sizeof(findData));
setbuf(stdout, NULL); //do not buffer stdout
tFindData->fCaseSensitve = 1; //set case sensitve
findDataTest(tFindData); //works perfect!
tFindData->fCaseSensitve = 0; //set case insensitve
findDataTest(tFindData); //abort after 3 times
return 0;
}
void findDataTest(findData *tFindData) {
if (tFindData->fCaseSensitve)
tFindData->__strstr = strstr; //if case sensitive use strstr
else
tFindData->__strstr = StrStrIA; //Warning from Eclipse: assignment from incompatible pointer type [enabled by default], but why? LPSTR == char*
findDataTest2(tFindData); //and here we test it
}
void findDataTest2(findData *tFindData) {
__StrStr __strstr;
int i = 0;
__strstr = tFindData->__strstr;
for (; i < 10; i++) {
printf("Test %d:\t", i);
//if (StrStrI(Test1, Test2)) //this works like a charm!
if (__strstr(Test1, Test2)) //this abborts after 3 times on case insenstive
printf("str is in str!\n");
else
printf("nope! str isn't in str!\n");
}
}
StrStrI*()
函數不使用cdecl
而是使用stdcall
調用約定。
為了解決這個問題,您可能需要在StrStrI*()
像這樣的函數周圍引入一個包裝器
char * strstri(const char * s1, const char * s2)
{
return StrStrIA(s1, s2);
}
並初始化指向比較函數的指針使用
void findDataTest(findData *tFindData)
{
if (tFindData->fCaseSensitve)
tFindData->__strstr = strstr; //if case sensitive use strstr
else
tFindData->__strstr = strstri;
findDataTest2(tFindData); //and here we test it
}
附帶說明:不要在 C 代碼中使用__
作為前綴,因為(在大多數情況下)這是 C 標准不允許的。
例如,將__StrStr
替換為__StrStr
,將StrStrFunc
__strstr
為pfstrstr
或strstrfunc
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.