控制台在将其存储到char之前在相同代码上显示问号*

时间:2015-10-23 16:22:40

标签: c++ character

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();

2 个答案:

答案 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实例返回给调用者。

通过这种方式,您的代码将更加简单,清晰并且不易出错。