int main(int argc, char * argv[]){
char file_extension[10];
strncat(file_extension, argv[2][5], 6);
当我这样做时,我得到“警告:传递 'strncat' 的 arg 2 使指针从整数而不进行强制转换'。有谁知道如何解决这个问题?
argv[2]
是 a char *
,所以这会使argv[2][5]
achar
strncat
只接受char *
参数!
因此,如果我最终设法正确理解了您所有模棱两可的评论:您似乎想复制字符串的一部分。
const char foo[] = "abcdefghijklm";
const size_t start = 3;
const size_t len = 5;
char the_copy[len + 1];
memcpy(the_copy, foo + start, len);
the_copy[len] = 0;
argv[2][5]
只是一个字符。
尝试使用argv[2]
.
你有几个问题:
argv[2][5]
是单个字符:第 3 个输入参数的第 6 个字符,但 的第二个参数strncat
采用指向字符(即 C 字符串)的指针,而不是单个字符file_extension
开始时不是空终止的(它是未初始化的),所以调用它是未定义的strncat
行为strncat
是要连接的源字符串的最大字符数,而不是输出缓冲区的大小——它不能保护您免受缓冲区溢出的影响。strncpy
而不是strncat
,那么您还需要注意strncpy
不一定会以空值终止输出这些问题有一些简单的解决方法,但对您来说最好的解决方法取决于您将要做什么:文件扩展名是只读的吗?你在构建一个新的文件名吗?它会发生什么?
我强烈建议你买一本关于 C 字符串和 C 编程的好书,而不是在没有充分理解它在做什么的情况下盲目地编写字符串代码,尤其是当代码编写不正确时存在缓冲区溢出和内存损坏的高风险.