我试图将用户输入读入C中的字符数组并将其转换为整数。这是我的方法,我想确保用户不能输入超过255个字符。我不确定是否声明一个固定大小的数组并使用fgets将为我处理这个问题。
当我已经罚款的user_input将是一个大小为255的数组时,将f 254放入fgets也不是多余的吗?
这是我的方法,有更好的方法吗?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main() {
char user_input[255];
int num_entered;
fgets(user_input,255, stdin);
num_entered = atoi(user_input);
printf("Number entered is: %d\n", num_entered);
}
答案 0 :(得分:1)
以下是一些可帮助您检查fgets()
和strtol()
错误的代码。正如评论中所建议的那样,strtol()
的错误检查很多来自man page,这在学习新功能时总是一个好看的地方。
关于检查缓冲区溢出,您需要检查最后一个有效字符是否为\n
,如果是,则将其替换为空终止符。如果不是,那么它们就是缓冲区溢出。
注意:将这些想法抽象为函数可能更好,但这可以帮助您入门。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <limits.h>
#define BUFFSIZE 255
#define BASE 10
int main(void) {
char user_input[BUFFSIZE];
char *endptr;
long num_entered;
size_t slen;
printf("Enter string: ");
/* fgets() returns NULL on error */
if (fgets(user_input, BUFFSIZE, stdin) == NULL) {
printf("Error reading buffer.\n");
exit(EXIT_FAILURE);
}
/* removing '\n' character, and checking for overflow */
slen = strlen(user_input);
if (slen > 0) {
if (user_input[slen-1] == '\n') {
user_input[slen-1] = '\0';
} else {
printf("Exceeded buffer size of %d.\n", BUFFSIZE);
exit(EXIT_FAILURE);
}
}
/* checking is something useful was entered */
if (!*user_input) {
printf("No user input entered.\n");
exit(EXIT_FAILURE);
}
errno = 0;
num_entered = strtol(user_input, &endptr, BASE);
/* error checking for strtol() */
if (endptr == user_input) {
printf("No digits parsed from input.\n");
exit(EXIT_FAILURE);
}
/* validating that range is within bounds */
if (((num_entered == LONG_MAX || num_entered == LONG_MIN) && errno == ERANGE)
|| (errno != 0 && num_entered == 0)) {
printf("number found is out of range.\n");
exit(EXIT_FAILURE);
}
printf("strtol() found: %ld\n", num_entered);
/* prints out excess characters found */
if (*endptr != '\0') {
printf("Further characters found after number: %s\n", endptr);
}
exit(EXIT_SUCCESS);
}