我遇到了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个字符。为什么会这样?
答案 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。