2010-01-10 233 views
3

我试图在C++中读取一个字符的缓冲区,直到'\ n',并使用do-while循环初始化带有这些字符的char数组。我知道我可以使用cin.getline(),但我想自己尝试一下。读取缓冲区C++

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; 
} 

它给了我不正确的结果 - 正确的文字休闲几行方括号与其他奇怪的符号混合。

+0

顺便说一句,'std :: getline()'比'std :: istream :: getline()'更简单,因为后者要求你提前选择缓冲区大小。 – jamesdlin 2010-01-10 20:02:25

回答

5

起初,整个文本后,你必须追加'\0'作为字符串

的到底应该看起来像buffer[ index ] = 0;因为你应该重写你追加太贵\n角色。

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

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

+1我会这样做,因为它更清楚地表明ZT已经完成(你不需要查找整个缓冲区已被设置为“0”) – epatel 2010-01-10 20:01:06

3

您不是零分隔您的缓冲区。

尝试的第一行只有最后一个字符改为

char buffer[1024] = ""; 

这将buffer所有字符设置为0,或者,设置为0,通过之后做

buffer[index] = 0; 

循环。

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

+0

你确定'char buffer [1024] =“”;'将所有字符设置为0吗?它不等于'char buffer [0] = 0;'?我不知道,我在问。我相信,这将所有字符设置为0'char buffer [1024] = {0};' – Gaim 2010-01-10 20:05:52

+0

是的,我确定。 “如果大括号包含的列表中的初始化器数量少于聚合的元素或成员数量,或者用于初始化比数组中的元素大小的数组的字符串字符串中的字符数更少,则聚合的其余部分应该被隐式地初始化为具有静态存储持续时间的对象。“见例如http://stackoverflow.com/questions/453432/difference-in-initalizing-and-zeroing-an-array-in-c-c – 2010-01-10 20:10:16

+0

(回复删除的评论)不,它不。请阅读我所引用的和谷歌一些。这将**整个数组**设置为零。准确地说:*字符串文字中的*或更少的字符*(这是真的,因为有0 <1024个字符)*用于初始化已知大小的数组* *(= 1024)*聚合的其余部分应隐式地初始化与具有静态存储持续时间*的对象相同(这是零,因为静态数组已初始化为全零)。 – 2010-01-10 20:41:56

0

当你到达一个换行符时,你停止填充缓冲区,所以剩下的部分是未初始化的。您可以通过以下方式对缓冲区进行初始化:char buffer[1024] = {0};这将解决您的问题。

2

两件事情:

  1. 如果线的长度你 读数超过1024,你写过去 这是坏的缓冲区。
  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; 
} 
1

几个问题我注意到:

(1)什么字符编码输入。您可能正在阅读8,16或32位字符。你确定你正在读ASCII吗?(2)根据您的平台,您正在搜索'\ n'行尾字符可能是'\ r \ n'或'\ r'或'\ n'。也许\角色本身就是你的方括号?

+2

缺少零字节存在主要问题在结束char序列的字符串中。这些笔记很有用,但现在它们并不重要 – Gaim 2010-01-10 19:57:57

0

您不在字符串末尾加'\ 0'。另外,你应该真的检查缓冲区溢出情况。当索引达到1024时停止读取。