如何读取字符数组并转换为C中的整数并进行错误检查?

时间:2017-01-16 03:38:07

标签: c fgets

我试图将用户输入读入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);
}

1 个答案:

答案 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);
}