MinGW 中的 strstr 和 StrStrI 以及 C 中的函数作为参数
strstr and StrStrI in MinGW and with function as parameter in C
我有什么
我有一个奇怪的问题。我有一个读取 PCAP 文件的大程序。现在我想在这个 pcap 文件中进行搜索。正如我提到的这个程序真的很大,所以我有很多功能和很多参数等。它是一个 Win32 应用程序,我使用 MinGW。
我想要的
现在我想执行区分大小写的搜索 (strstr
) 或不区分大小写的搜索 (StrStrI
from Shlwapi
) 取决于用户在 GUI 中选择的内容。搜索量很大,可以设置很多参数。所以我不想总是问 if (caseSensitve) then strstr(...) else StrStrI(...)
,我想在一开始就做出决定,我把它写在一个结构中, struct
经历不同的功能。
问题是什么:
When I do it like shown below my program stops working after using 3 times __strstr
when case insensitive is chosen (So it will 运行 StrStrI
). When Case sensitive is chosen __strstr
(strstr
) works perfect.但是当我直接使用 StrStrI
时它也很完美......
我总是从 Eclipse 收到警告:
assignment from incompatible pointer type [enabled by default]
但是为什么呢? LPSTR
与 char*
相同,不是吗?而函数的typedef
return是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*()
-function 引入一个包装器
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
替换为 StrStrFunc
,将 __strstr
替换为 pfstrstr
或 strstrfunc
。
我有什么
我有一个奇怪的问题。我有一个读取 PCAP 文件的大程序。现在我想在这个 pcap 文件中进行搜索。正如我提到的这个程序真的很大,所以我有很多功能和很多参数等。它是一个 Win32 应用程序,我使用 MinGW。
我想要的
现在我想执行区分大小写的搜索 (strstr
) 或不区分大小写的搜索 (StrStrI
from Shlwapi
) 取决于用户在 GUI 中选择的内容。搜索量很大,可以设置很多参数。所以我不想总是问 if (caseSensitve) then strstr(...) else StrStrI(...)
,我想在一开始就做出决定,我把它写在一个结构中, struct
经历不同的功能。
问题是什么:
When I do it like shown below my program stops working after using 3 times __strstr
when case insensitive is chosen (So it will 运行 StrStrI
). When Case sensitive is chosen __strstr
(strstr
) works perfect.但是当我直接使用 StrStrI
时它也很完美......
我总是从 Eclipse 收到警告:
assignment from incompatible pointer type [enabled by default]
但是为什么呢? LPSTR
与 char*
相同,不是吗?而函数的typedef
return是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*()
-function 引入一个包装器
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
替换为 StrStrFunc
,将 __strstr
替换为 pfstrstr
或 strstrfunc
。