-3
int main(int argc, char * argv[]){

   char file_extension[10];

   strncat(file_extension, argv[2][5], 6);

当我这样做时,我得到“警告:传递 'strncat' 的 arg 2 使指针从整数而不进行强制转换'。有谁知道如何解决这个问题?

4

4 回答 4

3

argv[2]是 a char *,所以这会使argv[2][5]achar

strncat只接受char *参数!

于 2013-02-08T19:08:17.967 回答
2

因此,如果我最终设法正确理解了您所有模棱两可的评论:您似乎想复制字符串的一部分。

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;
于 2013-02-08T19:13:45.163 回答
2

argv[2][5]只是一个字符。

尝试使用argv[2].

于 2013-02-08T19:08:55.540 回答
1

你有几个问题:

  • argv[2][5]是单个字符:第 3 个输入参数的第 6 个字符,但 的第二个参数strncat采用指向字符(即 C 字符串)的指针,而不是单个字符
  • file_extension开始时不是空终止的(它是未初始化的),所以调用它是未定义的strncat行为
  • 的最后一个参数strncat是要连接的源字符串的最大字符数,而不是输出缓冲区的大小——它不能保护您免受缓冲区溢出的影响。
  • 如果您实际上打算写strncpy而不是strncat,那么您还需要注意strncpy 不一定会以空值终止输出

这些问题有一些简单的解决方法,但对您来说最好的解决方法取决于您将要做什么:文件扩展名是只读的吗?你在构建一个新的文件名吗?它会发生什么?

强烈建议你买一本关于 C 字符串和 C 编程的好书,而不是在没有充分理解它在做什么的情况下盲目地编写字符串代码,尤其是当代码编写不正确时存在缓冲区溢出和内存损坏的高风险.

于 2013-02-08T19:10:15.307 回答