示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void free_trial() {
char input_buf[32];
char crushed[32];

for (int i=0; i<16; i++) {
printf("Enter a string to crush:\n");
fgets(input_buf, sizeof(input_buf), stdin);


printf("Enter crush rate:\n");
int rate;
scanf("%d", &rate);

if (rate < 1) {
printf("Invalid crush rate, using default of 1.\n");
rate = 1;
}

printf("Enter output length:\n");
int output_len;
scanf("%d", &output_len);

if (output_len > sizeof(crushed)) {
printf("Output length too large, using max size.\n");
output_len = sizeof(crushed);
}

crush_string(input_buf, crushed, rate, output_len);


printf("Crushed string:\n");
puts(crushed);
}
}

在本地与这段代码交互时,由于 scanf("%d", ...); 有一个机制:遇到非数字自动截断,并将数字后面的部分保留在缓冲区中供下一次输入使用,这样如果直接使用 sendline 发送数据的话, fgets 会被跳过(scanf 不会被跳过,因为 %d 会跳过前导空白字符去读取数字)

为了避免这种情况发生,我们可以在发送 scanf 所需的数字后面直接加上要发送给 fgets 的数据,这样一来可以在依次 sendline 中通过两个读入函数

关于缓冲区的更多知识还有待学习www