【问题标题】:Strncpy add characterstrncpy 添加字符
【发布时间】:2014-08-12 12:14:39
【问题描述】:

我需要通过添加“_out”和更改扩展名来修改通过参数传递的文件名。所以,首先,我复制没有扩展名的旧文件的名称,就像那样

  char* arg1 = argv[1];

  char* var1 = NULL;
  var1 = malloc(strlen(arg1) * sizeof(char));
  strcpy( var1, arg1 );
  var1[strlen(var1) - 1] = 'l';
  var1[strlen(var1) - 2] = 'm';
  var1[strlen(var1) - 3] = 'x';

  char* var1Out = NULL;
  var1Out = malloc((strlen(var1) + 4) * sizeof(char));

  strncpy( var1Out, var1, strlen(var1) - 4 ); //Marker


             .
             .
             .

但是当我在“//Marker”之后使用 printf 显示 var1Out 时,通过参数传递“test.txt”,我得到:“test└”,最后我的程序返回“test└” _out.xml”结尾。 而当我像这样修改标记线时:

strncpy( var1Out, var1, strlen(var1) - 3 ); //Marker

它显示:

测试。

并与:

strncpy( var1Out, var1, strlen(var1) - 5 ); //Marker

它显示:

特斯

所以它工作得很好。

为什么我使用的时候会加一个字符:

strncpy( var1Out, var1, strlen(var1) - 4 ); //Marker

?

【问题讨论】:

  • 每个字符串函数在the documentation 中的某个时间,以及确切它们的作用,可能会有所帮助。而且我很好奇当传递的命令行参数为"x"(或任何其他短于至少三个字符的字符串)时,您认为您的程序会做什么。小心你的假设。他们可以回来咬你。

标签: c string copy strncpy


【解决方案1】:

var1 的分配中,您错过了零终止符的空间。使用

malloc(strlen(arg1) + 1)

【讨论】:

  • 对不起,我错了,它不起作用。将 malloc(strlen(arg1)) 更改为 malloc(strlen(arg1) + 1) 后,我遇到了同样的错误。这很奇怪,因为有时没有这个错误,但有时有。请问有什么想法吗?谢谢
  • 看到错误时使用的命令行参数是什么?
  • 我的程序名为“Test”,文件名为“myFile.ext”。在命令中我运行“Test myFile.ext”。但是当我显示 var1Out 时,我会在“myFile”的末尾得到“myFile8”或“myFileM”或其他任意字符,而不仅仅是“myfile”。
  • 您的最后一行 strncpy( var1Out, var1, strlen(var1) - 4 ); 将指定数量的字符从 var1 复制到 var1Out,但不会在末尾添加零终止符。所以你最终得到的 var1Out 不包含以零结尾的字符串,当你尝试打印它时,你会在复制的字符之后得到随机字符,甚至崩溃。
  • 是的,我发现了,只是我写了一个新答案,解释我如何用这个解决方案解决这个问题。
【解决方案2】:

strncopy

如果满足以下条件,则不会在目标末尾隐式附加空字符 source 比 num 长。因此,在这种情况下,目的地不得 被认为是一个空终止的 C 字符串(这样读取它会 溢出)。
http://www.cplusplus.com/reference/cstring/strcpy/

这就是为什么我在字符串中添加了一个字符,因为它不被视为以空字符结尾的 C 字符串。

所以在我的代码中添加:

  var1Out[strlen(var1)- 4] = '\0';

有效。

【讨论】:

    猜你喜欢
    • 2012-04-07
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2021-02-19
    相关资源
    最近更新 更多