2013-03-26 5 views
0

Je suis en train d'utiliser strstr fonction comme ceci:test si strstr retourner un pointeur valide

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

Contrairement à l'attendu, quand je fais le « si » le compilateur génère une exception de violation de la position d'accès. Cela se produit chaque fois que j'essaie d'obtenir un mot clé qui n'existe pas dans une chaîne.

La pile d'appel est:

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() 

La sortie était:

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. 

Juste avant l'exception, les valeurs des variables sont:

  1. Chave: 0x00196f64 "$ GNGSA" type: char *
  2. Origine: 0x00196840 "$ GPRMC, 000651.082, V ,,,,,,, 19 1210 ,,, N * 4F $ GPGGA, 000652,091 ,,,,, 0,00 ,,, M, 0,0, M ,, 0000 * 5F $ GPGSA, A, 1 ,,,,,,,,,,,, ,,, * 1E » type: const char *
  3. pInicio: 0x00000000 invalide> Type: const char *

la ligne de commande de liaison est:

/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 

aussi le c/C++ ligne de commande est

/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 

Ensuite, j'essaie de tester le pointeur s'il est nul. C'est mon problème maintenant, comment résoudre ce problème?

Meilleures salutations!

+1

Ne ressemble pas à ce code. Etes-vous sûr que les paramètres de 'strstr' sont valides? –

+0

Etes-vous sûr que l'erreur se produit sur la ligne 'if'? – Barmar

+1

Si vous obtenez une violation d'accès de la part de 'strstr()', les adresses que vous passez ne sont pas valides ou les chaînes référencées ne sont pas terminées. Je vous suggère de valider les deux conditions * avant de conclure que quelque chose ne va pas avec le code ci-dessus. – WhozCraig

Répondre

2

Impossible de dupliquer votre bogue. Voici ce que j'ai essayé:

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; 
} 

Cela compile et s'exécute sans erreur dans Visual Studio 2010. Il ne trouve pas de correspondance, d'ailleurs. Je suis ouvert aux instructions sur la façon de l'ajuster pour créer le bug.

--edit--

Set ligne de commande du compilateur à:/ZI/nologo/W3/WX/BVB/Oy-/D "WIN32"/D "_DEBUG"/D "_CONSOLE"/D "_UNICODE"/D "UNICODE"/Gm/EHsc/RTC1/GS/fp: précise/Zc: wchar_t/Zc: forScope/Fp "Debug \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ' Fd "Debug \ vc100.pdb"/Gd/analyse-/errorReport: file d'attente

Ligne de commande de l'éditeur de liens: /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: "niveau = 'asInvoke r 'uiAccess =' ​​faux '"/ 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

Même avec les deux lignes de commande essentiellement les mêmes, je ne reçois toujours pas l'erreur. Je ne sais pas quoi dire, désolé.

+0

Mais c'est exactement ce que je fais. Certains que j'ai remarqué est que c compilateur dans VS2010 est C89. Il y a un problème avec ça? –

+0

Peut-être que cela m'aiderait si vous pouviez regarder les paramètres de votre projet et publier la ligne de commande pour C/C++ et Linker. Je peux les entrer comme le mien pour être sûr que je construis comme vous. –

+0

J'ai essayé de faire la même chose et je crois que ça n'a pas marché! J'ai même mis une autre déclaration avec un printf ("n'a pas trouvé") et l'a imprimé. –

Questions connexes