如何处理C中的缓冲区溢出?

问题描述 投票:-2回答:1

如果输入的长度大于2,为什么此代码会多次跳过循环?

它似乎与缓冲区溢出有关。但是我可以在循环结束时清除输入缓冲区以及如何清除输入缓冲区?

#include <stdio.h>

int main(void)
{
    char in[2];
    while (in[0] != 'q') {
        puts("Enter: ");
        fgets(in, 3, stdin);
    }
    return 0;
}

我想让用户在每个循环中输入一些字符串。

c buffer fgets
1个回答
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.