我尝试获取字符串,这可能是终端参数的文件名。我想知道为什么会出现细分故障。
#include <stdio.h>
#include <string.h>
int main(char *argv[]){
char somefile[sizeof(argv)];
strncpy(somefile,argv[0],sizeof(argv));
printf("The file name is: %s", somefile);
return 0;
}
要获得argv的长度,您只能做strlen(argv[0])
。
一切都在这一主要问题中变得更加复杂。strncpy
应该使用字符串的长度,除了它应该可以工作。
您的语句:
strncpy(somefile,argv[0],sizeof(argv));
将指针(即可能的4或8(的长度交给了第三个参数,而不是字符串的实际大小。将其更改为:
char somefile[strlen(argv[0])+1]; // note extra space for NULL terminator...
strncpy(somefile,argv[0],strlen(argv[0])+1); // ...here as well
注意, strncpy(dest, src, n)
(例如(在字符数组的大多数n
字符上复制了SRC指向的字符数组。如果在复制整个数组src
之前达到n
,则结果字符数组,dest
不会被终止。为了减轻这种潜力,您可以考虑执行以下操作:
char src[] = "this string is too long";
char dest[10];
int n = 10;
strncpy (dest, src, n);
在包含dest
中结果:
|t|h|i|s| |s|t|r|i|n|?|?|?|...// may, or may not have a null terminator somewhere.
dest[n-1] = 0;
在包含:
的dest
中结果 |t|h|i|s| |s|t|r|i| |?|?|?|...// guaranteed NULL termination.
,并且由于somefile
是基于argv[0]
strcpy(somefile,argv[0]);
在这种情况下也一样。