首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >argv问题,c中的新知识

argv问题,c中的新知识
EN

Stack Overflow用户
提问于 2010-12-23 10:26:33
回答 4查看 144关注 0票数 2

我和艾尔夫有点问题。

代码语言:javascript
复制
meltcheck(argv[1]);

功能:

代码语言:javascript
复制
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;
}

很抱歉,当我试图粘贴它时,代码变得一团糟。但问题是,即使字符串大于4个字符,argv也只能存储4个字符。这一切为什么要发生?

EN

回答 4

Stack Overflow用户

发布于 2010-12-23 10:35:01

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

您的函数应如下所示:

代码语言:javascript
复制
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
    }
}
票数 3
EN

Stack Overflow用户

发布于 2010-12-23 10:36:55

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

原因是,当将数组传递给C中的函数时,数组会衰减为指向其第一个元素的指针。因此,当你使用sizeof(a)时,你得到的是指针的大小,而不是数组的大小。在本例中,它与sizeof(char *)相同,正如您所观察到的,在32位机器上,它将是4。

不过,您也在以一种不是真正想要的方式使用strncat。第三个参数的要点是,如果strlen(a)比要复制到的缓冲区中的空间量(在本例中为dir )长,则防止缓冲区溢出。我想你想要的是:

代码语言:javascript
复制
strncat(dir, a, 595); /** 600 - "dir " - \0 = 595 */

因为dir中还有595个字符的空间。

还要注意,您不能使用!=比较C字符串。您的if语句应该改用strcmp

票数 1
EN

Stack Overflow用户

发布于 2010-12-23 10:31:38

我认为问题在于sizeof( a )会返回sizeof(char*) (一个字符的长度),而不是字符串a的长度,所以它只复制了四个字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4515387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档