C-终端参数引起的分割故障



我尝试获取字符串,这可能是终端参数的文件名。我想知道为什么会出现细分故障。

#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]);   

在这种情况下也一样。

相关内容

  • 没有找到相关文章

最新更新