读缓冲C ++

时间:2010-01-10 19:51:51

标签: c++

我正在尝试用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括号与其他怪异符号混合的正确文本。

6 个答案:

答案 0 :(得分:5)

首先,在整个文本之后,您必须将'\0'附加为字符串

它应该看起来像buffer[ index ] = 0;,因为你应该重写你追加的\n字符。

当然,还有其他一些你应该检查的东西,但它们不是你的主要问题

  • 输入的长度,因为缓冲区有限 - 最大长度为1023 +空字节
  • 标准输入结束cin.eof()

答案 1 :(得分:3)

你没有空分隔你的缓冲区。

尝试将第一行更改为

char buffer[1024] = "";

这会将buffer中的所有字符设置为0.或者,通过执行

,只将最后一个字符设置为0
buffer[index] = 0;
循环后

此外,(如其他人正确指出的)如果文本长度超过1024个字符,则会出现缓冲区溢出错误 - 这是软件中安全问题最常被利用的原因之一。

答案 2 :(得分:2)

两件事:

  1. 如果你是这条线的长度 阅读超过1024你写的过去 缓冲区是坏的。
  2. 如果长度在 限制,你没有终止 带有null char的字符串。
  3. 您可以尝试以下方式进行操作。这样,如果你发现超过缓冲区大小的罚款,我们会截断它,并在循环的末尾添加空字符。

    #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时停止读取。