在C中模拟VB6中的字符串连接行为

时间:2015-11-13 07:15:50

标签: c

我目前正在尝试将程序从VB6移植到简单C.许多函数使用&运算符的多个实例来连接这样的字符串:

(VB6代码)

Public Function myFunc (myString As String) As String
Dim myNewString As String
myNewString = globalString & myString
myFunc = myNewString
End Function

背后的意图是将不同的字符串连接在一起。这是在代码中多次完成的。

我目前正在仿效这样的行为:

sprintf(myString, "%s%s", myString, newString);

字符串声明如下:

char myString[500] = {};
char newString[100] = {};

非常重要的是要注意,我的连接操作永远不会超过字符串的最大长度,因为这对于该程序处理的任何场景都是不可能的。

我现在的问题是:

  • 假设我从未超过char数组的最大长度,这是一种安全且有效的方法来模拟此操作(到目前为止,我还没有遇到过生产测试中的任何问题)
  • 有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

  

1。 [...]这是一种安全且有效的模拟此操作的方法(到目前为止,我还没有遇到过生产测试中的任何问题)

不,一点也不。你的代码,

var url = '@Url.Action("ViewOptionvalues", "Options")';
$('.view').click(function() {
  var nextRow = $(this).closest('tr').next('tr');
  $.get(url, { id: $(this).data('id') }, function(response) {
    nextRow.find('div').html(response);
    nextRow.toggle();
  });
})

生成undefined behavior

sprintf(myString, "%s%s", myString, newString); 标准中所述,章节§7.21.6.6,C11函数

  

[...]如果在重叠的对象之间进行复制,则行为未定义。

然后,

  

2。有没有更好的方法来做到这一点?

是的,当然。您应该使用strcat()来连接字符串。

答案 1 :(得分:1)

如果目标字符串足够大且已包含有效的以null结尾的字符串,则只需使用strcat

strcat(myString, newString);