(C)如何使用带有** argv的strncat()?

时间:2013-02-08 19:04:49

标签: c pointers argv

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

   char file_extension[10];

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

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

4 个答案:

答案 0 :(得分:3)

argv[2]char *,因此argv[2][5]成为char

strncat仅接受char *个参数!

答案 1 :(得分:2)

argv[2][5]仅限char。

只使用argv[2]

答案 2 :(得分: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;

答案 3 :(得分:1)

你有几个问题:

  • argv[2][5]是单个字符:第3个输入参数的第6个字符,但strncat的第二个参数采用指向字符的指针(即C字符串) ),而不是单个字符
  • file_extension以空格终止(它未初始化),因此调用strncat的未定义行为
  • strncat的最后一个参数是要连接的源字符串的最大字符数,而不是输出缓冲区的大小 - 它不能保护您免受缓冲区溢出的影响。
  • 如果你真的打算写strncpy而不是strncat,那么你还需要注意strncpy does not necessarily null-terminate the output

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

强烈建议您获得一本关于C字符串和C编程的好书,而不是试图盲目地编写字符串代码而不必深入了解它正在做什么,尤其是缓冲区溢出的高风险代码编写不正确时内存损坏。