1

我正在运行以下程序并出现错误:

First-chance exception at 0x0f32d440 (msvcr100d.dll) in c.exe: 0xC0000005: Access violation reading location 0x00000000.
Unhandled exception at 0x772815de in c.exe: 0xC0000005: Access violation reading location 0x00000000.
The program '[9048] c.exe: Native' has exited with code -1073741510 (0xc000013a).

这是代码

#include <string.h>
#include <stdio.h> 
#include <stdlib.h> 
int main(int argc, char *argv[], char *env[]) //char *argv[] 
{ 
int i; 

printf("These are the %d command- line arguments passed to main:\n\n", argc); 
if(strcmp(argv[1],"123")==0)                
    {
        printf("success\n");
     }
else
for(i=0; i<=argc; i++) 
    //if(strcmp(argv[1],"abc")==0)

    printf("argv[%d]:%s\n", i, argv[i]);
/*printf("\nThe environment string(s)on this system are:\n\n"); 
for(i=0; env[i]!=NULL; i++) 
printf(" env[%d]:%s\n", i, env[i]);*/ 
system("pause");
} 

问题应该出在 strcmp 函数上,但我不知道如何解决。有人可以帮忙吗?

4

2 回答 2

3

你有(至少)两个问题。

首先是这样做:

if(strcmp(argv[1],"123")==0) 

没有先检查argc >= 2

第二个是这样的:

for(i=0; i<=argc; i++) 

因为你应该0通过argc - 1包容性来处理论点。该循环所做的是处理参数0argc并且argv[argc]总是NULL

以下程序说明了解决此问题的一种方法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char *argv[]) {
    int i;

    printf ("These are the %d command-line argument(s) passed to main:\n", argc);
    if ((argc >= 2) && (strcmp (argv[1], "123") == 0)) {
        printf ("   success\n");
    } else {
        for (i = 0; i < argc; i++)  {
            printf ("   argv[%d] = [%s]\n", i, argv[i]);
        }
    }
    return 0;
}

您可以看到,"123"只有在确保argv[1]正确填充之后才进行比较。此外,循环已更改为排除argv[argc],因为这不是参数之一。抄录如下:

pax> testprog
These are the 1 command-line argument(s) passed to main:
   argv[0] = [testprog]

pax> testprog 123
These are the 2 command-line argument(s) passed to main:
   success

pax> testprog a b c
These are the 4 command-line argument(s) passed to main:
   argv[0] = [testprog]
   argv[1] = [a]
   argv[2] = [b]
   argv[3] = [c]
于 2013-06-06T04:11:39.180 回答
1

for(i=0; i<=argc; i++)应该是for(i=0; i<argc; i++)

C/C++ 数组是 0 到 n-1。您在阵列末端运行 1 个点。

于 2013-06-06T04:06:48.393 回答