-5

以下几行有什么问题?

//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

4

1 回答 1

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");

编译时没有警告,但由于参数使用不正确而崩溃。strcpy_s和的第二个参数strcat_s目标缓冲区的长度,而不是源字符串的长度。由于strlen(arg[v])不包括 nul 终止符,因此strcpy_s将失败,因为它将尝试复制比指示的多一个字节。

正确使用第二个参数:

#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
于 2016-11-19T09:17:06.760 回答