我正在尝试用C ++中的一个字符读取缓冲区,直到'\ n',并使用do-while循环使用这些字符初始化char数组。我知道我可以使用cin.getline(),但我想自己尝试一下。
int main()
{
char buffer [1024];
int index = 0;
char temp;
do
{
cin.get( temp );
buffer [ index ] = temp;
index ++;
}
while ( temp != '\n' );
cout << buffer << endl;
return 0;
}
它给了我不正确的结果 - 通过几行squre括号与其他怪异符号混合的正确文本。
答案 0 :(得分:5)
首先,在整个文本之后,您必须将'\0'
附加为字符串
它应该看起来像buffer[ index ] = 0;
,因为你应该重写你追加的\n
字符。
当然,还有其他一些你应该检查的东西,但它们不是你的主要问题
cin.eof()
答案 1 :(得分:3)
你没有空分隔你的缓冲区。
尝试将第一行更改为
char buffer[1024] = "";
这会将buffer
中的所有字符设置为0.或者,通过执行
buffer[index] = 0;
循环后。
此外,(如其他人正确指出的)如果文本长度超过1024个字符,则会出现缓冲区溢出错误 - 这是软件中安全问题最常被利用的原因之一。
答案 2 :(得分:2)
两件事:
您可以尝试以下方式进行操作。这样,如果你发现超过缓冲区大小的罚款,我们会截断它,并在循环的末尾添加空字符。
#define MAX 1024
int main()
{
char buffer [MAX];
int index = 0;
char temp;
do
{
// buffer full.
if(index == MAX-1)
break;
cin.get( temp );
buffer [ index ] = temp;
index ++;
}
while ( temp != '\n' );
// add null char at the end.
buffer[index] = '\0';
cout << buffer << endl;
return 0;
}
答案 3 :(得分:1)
我注意到的几个问题:
(1)输入是什么字符编码。你可能正在阅读8,16或32位字符。你确定你在读ASCII吗?
(2)您正在搜索'\ n',行尾字符可以是'\ r \ n'或'\ r'或'\ n',具体取决于您的平台。也许\ r字符本身就是你的方括号?
答案 4 :(得分:0)
当你到达换行符时,你会停止填充缓冲区,所以其余部分都是未初始化的。您可以通过以下方式对缓冲区进行零初始化:char buffer[1024] = {0};
这将解决您的问题。
答案 5 :(得分:0)
你没有在字符串的末尾添加'\ 0'。此外,您应该检查缓冲区溢出情况。当索引达到1024时停止读取。