我尝试从终端参数中获取可能是文件名的字符串。我想知道为什么会出现分段错误。
#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;
}
答案 0 :(得分:2)
您的陈述:
strncpy(somefile,argv[0],sizeof(argv));
将指针的长度(即4或8)传递给第3个参数,而不是字符串的实际大小。将其更改为:
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)
(例如)复制src指向的字符数组的大多数n
个字符。如果在复制整个数组n
之前达到src
,则生成的字符数组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|\0|?|?|?|...// guaranteed NULL termination.
由于somefile
是根据argv[0]
strcpy(somefile,argv[0]);
在这种情况下,也会做得很好。
答案 1 :(得分:2)
要获得argv的长度,您可以改为class Temperature {
private:
...
//conversion tables
static std::map<TempType, std::function<double(double)>> fromCelsius = ...;
static std::map<TempType, std::function<double(double)>> fromFahrenheit = ...;
... and so on ...
};
。
一切都有点像这个重大问题。 strlen(argv[0])
应该使用字符串的长度,而不是看起来应该有效。