gpt4 book ai didi

c - 如何在 C 中读取字符数组并通过错误检查将其转换为整数?

转载 作者:行者123 更新时间:2023-11-30 20:21:43 27 4
gpt4 key购买 nike

我正在尝试将用户输入读取到 C 中的字符数组中并将其转换为整数。这是我的方法,我想确保用户不能输入超过 255 个字符。我不确定声明一个固定大小的数组并使用 fgets 是否可以为我处理这个问题。

当我已经确定 user_input 将是一个大小为 255 的数组时,在 fgets 中放入 255 不是多余的吗?

这是我的方法,有更好的方法吗?

#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);
}

最佳答案

这里有一些代码可以帮助您检查 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);
}

关于c - 如何在 C 中读取字符数组并通过错误检查将其转换为整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41669086/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com