gpt4 book ai didi

c - 如何防止用户输入超过最大限制的数据?

转载 作者:太空狗 更新时间:2023-10-29 15:18:41 24 4
gpt4 key购买 nike

这段代码要求用户提供数据,然后是一个数字:

$ cat read.c
#include<stdio.h>
#include<stdlib.h>
#define MAX 10

int main() {
char* c = (char*) malloc(MAX * sizeof(char));
int num;

printf("Enter data (max: %d chars):\n", MAX);
fgets(c, MAX, stdin);
// how do I discard all that is there on STDIN here?

printf("Enter num:\n");
scanf("%d", &num);

printf("data: %s", c);
printf("num: %d\n", num);
}
$

问题在于,除了说明最大字符数的指令外,没有什么可以阻止用户输入更多字符,随后将其作为垃圾读入 num:

$ ./read
Enter data (max 10 chars):
lazer
Enter num:
5
data: lazer
num: 5
$ ./read
Enter data (max 10 chars):
lazerprofile
Enter num:
data: lazerprofnum: 134514043
$

有没有办法在 fgets 调用后丢弃 STDIN 上的所有内容?

最佳答案

scanf() 函数对于用户输入来说很糟糕,对于文件输入也不是很好,除非你以某种方式知道你的输入数据是正确的(不要那么相信!)另外,你应该总是检查返回值fgets() 因为 NULL 表示 EOF 或其他一些异常。请记住,除非首先达到最大值,否则您会在 fgets() 数据的末尾获得用户的换行符。作为第一步,我可能会这样做:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10

void eat_extra(void) {
int ch;

// Eat characters until we get the newline
while ((ch = getchar()) != '\n') {
if (ch < 0)
exit(EXIT_FAILURE); // EOF!
}
}

int main() {
char c[MAX+1]; // The +1 is for the null terminator
char n[16]; // Arbitrary maximum number length is 15 plus null terminator
int num;

printf("Enter data (max: %d chars):\n", MAX);
if (fgets(c, MAX, stdin)) { // Only proceed if we actually got input
// Did we get the newline?
if (NULL == strchr(c, '\n'))
eat_extra(); // You could just exit with "Too much data!" here too

printf("Enter num:\n");
if (fgets(n, sizeof(n) - 1, stdin)) {
num = atoi(n); // You could also use sscanf() here
printf("data: %s", c);
printf("num: %d\n", num);
}
}

return 0;
}

关于c - 如何防止用户输入超过最大限制的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4177955/

24 4 0
文章推荐: html - 动画时长应该是相对于高度和宽度的
文章推荐: c - 获取字段在结构中的位置
文章推荐: javascript - parentNode 在 Javascript 内部闭包中丢失? Chrome 错误?
文章推荐: javascript - 从一个 HTML 页面中取出一个
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com