Следующее использование strcat_s показывает "C4047: различается по уровням косвенности"
Что не так со следующими строками?
//Thanks to Mark
#include <string.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
char datfile[127];
if(argc < 2) return -1;
strcpy_s(datfile, strlen(argv[1]), argv[1]);
strcat_s(datfile, strlen(argv[1]) + 4, ".dat");
printf("%s\n",datfile);//the warning appears here (why?)
return 0;
}
Это показывает Warning C4047 'function': 'const char *' differs in levels of indirection from 'char'
Я просмотрел документацию, предоставленную MSDN для C4047
, Называет термин под названием levels of indirection
, Я прошел через некоторые обсуждения, связанные с этой темой i.e. levels of indirection
в сети и (как новичок) я нашел те, которые выходят за рамки моего радара.
Я был бы очень рад, если бы кто-то указал на проблему с кодом выше и дал просто понятное объяснение термина level of indirection
,
1 ответ
Поддающийся проверке пример исходной ошибки:
#include <string.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
char datfile[127];
if(argc < 2)
return -1;
strcpy_s(datfile, strlen(argv[1]), argv[1]);
strcat_s(datfile, strlen(argv[1]) + 4, '.dat');
printf("%s\n",datfile);
return 0;
}
Выход VS2015 (cl / nologo / W4 test.c):
test.c
test.c(10): warning C4047: 'function': 'const char *' differs in levels of indirection from 'int'
test.c(10): warning C4024: 'strcat_s': different types for formal and actual parameter 3
"уровень косвенности" указывает на несоответствие уровня указателя. int, int*, int**
имеют разные уровни косвенности.
С предложением @Mat следующая строка изменилась на двойные кавычки:
strcat_s(datfile, strlen(argv[1]) + 4, ".dat");
Компилируется без предупреждений, но вылетает из-за неправильного использования параметров. 2-й параметр для strcpy_s
а также strcat_s
длина буфера назначения, а не длина строки источника. поскольку strlen(arg[v])
не включает нулевой терминатор, strcpy_s
потерпит неудачу, потому что попытается скопировать еще один байт, чем указано.
Правильное использование 2-го параметра:
#include <string.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
char datfile[127];
if(argc < 2)
return -1;
strcpy_s(datfile, sizeof datfile, argv[1]);
strcat_s(datfile, sizeof datfile, ".dat");
printf("%s\n",datfile);
return 0;
}
Выход:
C:\>cl /nologo /W4 test.c
test.c
C:\>test abc
abc.dat