2013-03-26 47 views
0

我试图使用功能的strstr像这样:测试返回的strstr有效的指针

const char * pInicio = strstr(origem, chave);  
if (pInicio != NULL) ... 

出乎预期的,当我做“如果”测试编译器会抛出一个访问位置冲突异常。每次尝试获取某个字符串中不存在的关键字时都会发生。

调用堆栈是:

ntdll.dll!779315de()  
    [Os quadros abaixo podem estar incorretos e/ou ausentes, nenhum símbolo foi carregado para ntdll.dll] 
    ntdll.dll!779315de()  
    ntdll.dll!7792014e()  
> msvcr100d.dll!_output_l(_iobuf * stream, const char * format, localeinfo_struct * plocinfo, char * argptr) Linha 2361 + 0xa bytes C++ 
    cccccccc() 

产量为:

Exceção de primeira chance em 0x0f8620a7 (msvcr100d.dll) no TestesApp.exe: 0xC0000005: Violação de acesso ao ler o local 0x00000001. 
Exceção sem-tratamento em 0x779315de no TestesApp.exe: 0xC0000005: Violação de acesso ao ler o local 0x00000001. 

右键异常之前,变量值分别为:

  1. 蔡夫:0x00196f64 “$ GNGSA”键入:char *
  2. Origem:0x00196840“$ GPRMC,000651.082,V ,,,,,,, 19 1210 ,,, N * 4F $ GPGGA,000652.091 ,,,,, 0,00 ,,, M,0.0,M ,, 0000 * 5F $ GPGSA,A,1 ,,,,,,,,,,,, ,,, * 1E”类型:常量字符*
  3. pInicio:00000000无效>类型:常量字符*

链接器命令行是:

/OUT:"C:\Users\Leandro\documents\visual studio 2010\Projects\TestesApp\Debug\TestesApp.exe" /INCREMENTAL /NOLOGO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"Debug\TestesApp.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Users\Leandro\documents\visual studio 2010\Projects\TestesApp\Debug\TestesApp.pdb" /SUBSYSTEM:CONSOLE /PGD:"C:\Users\Leandro\documents\visual studio 2010\Projects\TestesApp\Debug\TestesApp.pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE 

也是C/C++命令行是

/ZI /nologo /W3 /WX- /Od /Oy- /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Debug\TestesApp.pch" /Fa"Debug\" /Fo"Debug\" /Fd"Debug\vc100.pdb" /Gd /analyze- /errorReport:queue 

在此之后,我尝试测试指针,如果它为空。 那是我现在的问题,该如何解决?

此致敬礼!

+1

看起来不像它在这个代码中。你确定'strstr'的​​参数是有效的吗? – 2013-03-26 18:08:22

+0

你确定错误发生在'if'行吗? – Barmar 2013-03-26 18:09:53

+1

如果您从strstr()获得访问冲突,您传入的地址无效,或者它们引用的字符串未终止。我建议你在*结论上面的代码有问题之前验证两个条件*。 – WhozCraig 2013-03-26 18:20:12

回答

2

无法复制您的错误。以下是我尝试的:

int main(int argc, char **argv) 
{ 
    char * chave = "$GNGSA"; 
    const char * origem = "$GPRMC,000651.082,V,,,,,,,191210,,,N*4F $GPGGA,000652.091,,,,,0,00,,,M,0.0,M,,0000*5F $GPGSA,A,1,,,,,,,,,,,,,,,*1E"; 
    const char * pInicio = strstr(origem, chave); 
    if (pInicio != NULL) 
    { 
     printf("found it\n"); 
    } 
    return 0; 
} 

这个编译和运行Visual Studio 2010时没有错误。顺便说一下,它找不到匹配项。我接受关于如何调整它以创建错误的说明。

- 编辑 -

集编译器命令行到:/ ZI/NOLOGO/W3/WX-/ OD/Oy-/d “WIN32”/ d “_DEBUG”/ d “_CONSOLE”/ d “_UNICODE”/ D“UNICODE”/ Gm/EHsc/RTC1/GS/fp:precise/Zc:wchar_t/Zc:forScope /Fp"Debug\odt.pch“/ Fa”Debug \“/ Fo”Debug \ Fd“Debug \ vc100.pdb”/ Gd/analyze-/errorReport:队列

链接器命令行:/OUT:"E:\code\odt\Debug\odt.exe“/ INCREMENTAL/NOLOGO”kernel32.lib “”user32.lib“”gdi32.lib“”winspool.lib“”comdlg32.lib“”advapi32.lib“”shell32.lib“”ole32.lib“”oleaut32.lib“”uuid.lib“”odbc32.lib “”odbccp32.lib“/ MANIFEST/ManifestFile:"Debug\odt.exe.intermediate.manifest”/ ALLOWISOLATION/MANIFESTUAC:“level ='asInvoke r'uiAccess ='false'“/ DEBUG /PDB:"E:\code\odt\Debug\odt.pdb”/ SUBSYSTEM:CONSOLE /PGD:"E:\code\odt\Debug\odt.pgd“/ TLBID :1/DYNAMICBASE/NXCOMPAT/MACHINE:X86/ERRORREPORT:QUEUE

即使两个命令行基本相同,我仍然没有收到错误。我不知道该说什么,对不起。

+0

但这正是我正在做的。我注意到的一点是VS2010中的c编译器是C89。这有什么问题吗? – 2013-03-26 20:29:44

+0

也许它会帮助我,如果你可以看看你的项目设置并发布C/C++和链接器的命令行。我可以像他一样输入他们,以确保我像你一样建设。 – 2013-03-26 20:32:15

+0

我试图做同样的事情,并相信它没有工作!我甚至用printf(“找不到”)放了一个else语句并打印出来。 – 2013-03-26 20:32:52