2014-03-03 93 views
1

我是新手,尤其是C编程。我正在努力学习C语言,但我真的很糟糕。因此,我希望在所有的大师指导和指导下,我将能够把握它。防止C缓冲区溢出

我有以下代码(但面临缓冲区溢出问题):

char buffer[1024]; 
int i=0; 
char ch; 

while((ch=getchar())!='\n' 
{ 
If (ch==-1) break; 
Buffer[i++] = ch; 
} 

为了阻止缓冲区溢出,我可以做以下?

const int BUFFSIZE=1024; 
char ch; 
int i=0; 
while((ch=getchar())!=BUFFSIZE 
{ 
If (ch==-1) break; 
BUFFSIZE[i++] = ch; 
} 

预先感谢您!

+2

1.你说你想学习C. 2.你的问题标题是C++。你标记了C#这个问题。哪一个? –

+0

'BUFFSIZE [i ++]'? BUFFSIZE是** CONSTANT INTEGER **。你不能重新定义它的值,更不用说它作为** ARRAY **使用...... –

+0

你有'const int BUFFSIZE = 1024;'所以不,你不能像'BUFFSIZE [i ++] = ch;'' 。此外,在你的版本之后,你的验证子句中有一个错误 - 首先,它必须位于括号之间,其次,它应该看起来像这样:while(ch = getchar()&& i jmodrak

回答

2

首先,你的代码甚至不会编译。这是if,而不是If。您的变量是buffer,而不是Buffer。您不能使用整数(BUFFSIZE)作为数组...

接下来,不,这是错误的。您正在根据缓冲区大小测试输入字符,这是没有意义的。这是你如何用C读字符串和防止缓冲区溢出:

char buffer[1024]; 
fgets(buffer, sizeof buffer, stdin); 

如果您想通过文字来读取字符,OK,但你需要添加一个检查为i < BUFFSIZE - 1,并且还需要为null终止您字符串(这就是为什么你在检查中有- 1),假设你想用它作为字符串。

const int BUFFSIZE = 1024; 
/* initialize each element to 0 to ensure that the result is null terminated */ 
char buffer[BUFFSIZE] = {0}; 
int ch; 
int i = 0; 

while((ch=getchar()) != '\n' && i < BUFFSIZE - 1) 
{ 
    if (ch == EOF) break; 
    buffer[i++] = ch; 
} 
+0

那么,您可以使用BUFFSIZE [缓冲区]而不是缓冲区[BUFFSIZE],因为索引数组是一个通用操作符。 –

+0

@ RichardJ.RossIII:你说的是什么?你当然不能索引到一个int,这是OP在他的代码中的内容。如果'buffer'是一个int,那么你的例子将是相关的。 –

+0

建议'int ch'而不是'char ch'。 – chux