tnis是一个很长的函数,但关键问题在于char *变量.. **在我将其转换为存储数据而不是打印到控制台之前,该功能正常工作。
我试图使用<input id="kullanici_adi_text" type="text" name="kullanici_adi_text" value="Kullanıcı İsmini Giriniz..." onfocus="if(this.value=='Kullanıcı İsmini Giriniz...') {this.value=''; document.getElementById('kullanici_adi_text').style.color = 'blue';}" onblur="if(this.value==''){this.value='Kullanıcı İsmini Giriniz...'; document.getElementById('kullanici_adi_text').style.color = #fff; }"/>
代替char[]
当我得到一些缓冲区溢出错误时,所以现在它被分配,它显示???整个控制台。
在char*
char*
的正确方法是什么?
puts();
答案 0 :(得分:1)
std::strcat
在目标缓冲区中查找空字节。但是,指向的缓冲区RtTmpOsInfo
未初始化,因此在其上调用std::strcat
会导致未定义的行为。
而不是第一次std::strcat
来电,只使用
strcpy(RtTmpOsInfo,s1);
或者,如果您不确定s1
是否实际上有空字节,
strncpy(RtTmpOsInfo, s1, SOME_CONSTANT);
其中SOME_CONSTANT
是写入RtTmpOsInfo
的最大字节数。
答案 1 :(得分:0)
由于您将此问题标记为[c++]
而非[c]
,我建议您放弃使用难以阅读/使用/维护原始C类字符串缓冲区(以及相关的不安全字符串函数)比如strcat
),而是使用方便的C ++字符串类。
例如,您可以使用std::string
,然后您可以返回std::string
个实例而不是原始char*
(包含与char*
生命周期相关的所有问题原始指针!)。
您可以使用std::string
重载的 operator+
和 +=
连接子字符串,非常直观自然方式。
或者您可以使用 std::ostringstream
类,并使用流语义使用operator<<
构建整个字符串。
在这种情况下,一旦整个字符串合成,您只需调用 ostringstream::str()
方法即可将std::string
实例返回给调用者。
通过这种方式,您的代码将更加简单,清晰并且不易出错。