argv问题,c新手

时间:2010-12-23 02:26:33

标签: c

我遇到了argv的问题。

meltcheck(argv[1]);

功能:

int meltcheck(char a[])
{
        if(a != "a" && a != NULL)
        {
                char dir[600];
                strcpy(dir, "del ");
                strncat(dir, a, sizeof(a));
                dir[strlen(dir)] = '\0';
                printf("\ndtmeltcheck: %s\n", dir);
                //system(dir);
        }

        return 0;
}

很抱歉,当我尝试粘贴代码时代码搞砸了。但问题是argv只存储4个字符,即使字符串是> 4个字符。为什么会这样?

4 个答案:

答案 0 :(得分:3)

这里有很多问题。首先,您无法使用C中的==!=来比较字符串的内容 - 比较指针值,因此a != "a"将始终为TRUE。此外,根据定义,dir[strlen(dir)]始终等于'\0'sizeof(a)的大小为char *(即4),而不是数据的长度。

你的功能应该是这样的:

int meltcheck( char *a )
{
    if( a != NULL && strcmp( a, "a" ) != 0 ) {
        char dir[600];
        strcpy( dir, "del " );
        strcat( dir, a );
        printf( "\ndtmeltcheck: %s\n", dir );
        // system( dir );
        // note that you should be using the unlink() function here
    }
}

答案 1 :(得分:1)

您不能以这种方式将sizeof用作作为参数传递给函数的数组。

原因是当数组传递给C中的函数时,数组会衰减成指向其第一个元素的指针。因此,当您使用sizeof(a)时,您将获得指针的大小,而不是数组的大小。在这种情况下,它与sizeof(char *)相同,在32位机器上将是4,如您所见。

你也正在使用strncat,但实际上并非如此。第三个参数的要点是,如果strlen(a)长于您要复制到的缓冲区中的空间量,则阻止缓冲区溢出,在本例中为dir。我想你想要的是:

strncat(dir, a, 595); /** 600 - "dir " - \0 = 595 */

因为dir可以容纳595个字符。

另请注意,您无法使用!=比较C字符串。您的if语句应改为使用strcmp

答案 2 :(得分:0)

我认为问题是sizeof(a)会返回sizeof(char *)(poitner到字符的大小)而不是字符串a的长度。 所以它只复制四个字符。

答案 3 :(得分:0)

使用strlen而不是sizeof。在32位平台上,指针的大小为4。