C中如何处理缓冲区溢出?
How deal with buffer overflow in C?
为什么如果输入的长度大于2,这段代码会跳过多次循环?
好像和缓冲区溢出有关。但是我可以在循环结束时清除输入缓冲区吗?如何清除?
#include <stdio.h>
int main(void)
{
char in[2];
while (in[0] != 'q') {
puts("Enter: ");
fgets(in, 3, stdin);
}
return 0;
}
我想要求用户在每个循环中输入一些字符串。
首先,您的缓冲区不够大,无法容纳 2 个字符的字符串。 C 中的字符串需要附加一个额外的 '\0' 来标记结束。其次,当输入字符串比传递给它的缓冲区长时,fgets
将在输入缓冲区中保留字符。在再次调用 fgets
之前,您需要消耗这些字符。
这是一个函数,与 fgets
类似,它只会读取 buffer_len - 1
个字符。它还会消耗所有字符,直到换行符或 EOF。
int my_gets(char *buffer, size_t buffer_len)
{
// Clear buffer to ensure the string will be null terminated
memset(buffer, 0, buffer_len);
int c;
int bytes_read = 0;
// Read one char at a time until EOF or newline
while (EOF != (c = fgetc(stdin)) && '\n' != c) {
// Only add to buffer if within size limit
if (bytes_read < buffer_len - 1) {
buffer[bytes_read++] = (char)c;
}
}
return bytes_read;
}
int main(void)
{
char in[3]; // Large enough for a 2 char string
// Re-arranged to do/while
do {
puts("Enter: ");
my_gets(in, sizeof(in)); // sizeof(in) == 3
} while (in[0] != 'q');
return 0;
}
为什么如果输入的长度大于2,这段代码会跳过多次循环?
好像和缓冲区溢出有关。但是我可以在循环结束时清除输入缓冲区吗?如何清除?
#include <stdio.h>
int main(void)
{
char in[2];
while (in[0] != 'q') {
puts("Enter: ");
fgets(in, 3, stdin);
}
return 0;
}
我想要求用户在每个循环中输入一些字符串。
首先,您的缓冲区不够大,无法容纳 2 个字符的字符串。 C 中的字符串需要附加一个额外的 '\0' 来标记结束。其次,当输入字符串比传递给它的缓冲区长时,fgets
将在输入缓冲区中保留字符。在再次调用 fgets
之前,您需要消耗这些字符。
这是一个函数,与 fgets
类似,它只会读取 buffer_len - 1
个字符。它还会消耗所有字符,直到换行符或 EOF。
int my_gets(char *buffer, size_t buffer_len)
{
// Clear buffer to ensure the string will be null terminated
memset(buffer, 0, buffer_len);
int c;
int bytes_read = 0;
// Read one char at a time until EOF or newline
while (EOF != (c = fgetc(stdin)) && '\n' != c) {
// Only add to buffer if within size limit
if (bytes_read < buffer_len - 1) {
buffer[bytes_read++] = (char)c;
}
}
return bytes_read;
}
int main(void)
{
char in[3]; // Large enough for a 2 char string
// Re-arranged to do/while
do {
puts("Enter: ");
my_gets(in, sizeof(in)); // sizeof(in) == 3
} while (in[0] != 'q');
return 0;
}