我和艾尔夫有点问题。
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;
}很抱歉,当我试图粘贴它时,代码变得一团糟。但问题是,即使字符串大于4个字符,argv也只能存储4个字符。这一切为什么要发生?
发布于 2010-12-23 10:35:01
这里有很多问题。首先,您不能在C中使用==或!=来比较字符串的内容,因为后者会比较指针值,因此a != "a"将始终为真。此外,根据定义,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
}
}发布于 2010-12-23 10:36:55
您不能以这种方式在作为参数传递给函数的数组上使用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。
发布于 2010-12-23 10:31:38
我认为问题在于sizeof( a )会返回sizeof(char*) (一个字符的长度),而不是字符串a的长度,所以它只复制了四个字符。
https://stackoverflow.com/questions/4515387
复制相似问题