The strtol(), strtoll(), strtoul(), and strtoull() functions convert the initial portion of a string pointed to long int, long long int, unsigned long int, and unsigned long long int representation, respectively.

The atoi(), atol(), and atoll() functions convert the initial portion of astring pointed to int, long int, and long long int representation, respectively. Except for the behavior on error, they are equivalent to

atoi: (int)strtol(nptr, (char **)NULL, 10)
atol: strtol(nptr, (char **)NULL, 10)
atoll: strtoll(nptr, (char **)NULL, 10)

However, it is better to use strtol() and related functions because atoi(), atol(), and atoll():

Non-Compliant Example 1

The following code converts the string stored in the static array {{buff} to a signed integer value.

char buff [25];
int int_var;

fgets(buff, sizeof buff, stdin);
int_var = atoi(buff);

Unfortunately, atoi() and related functions lack a mechanism for reporting errors for invalid values.

Non-Compliant Example 2

The following example using sscanf() has the same problems as atoit().

char buff [25];
int int_var;

fgets(buff, sizeof buff, stdin);
sscanf("%d", buff, &int_var);

Compliant Solution

char buff [25];
char *end_ptr;
long long_var;
int int_var;

fgets(buff, sizeof buff, stdin);
            
errno = 0;
        
long_var = strtol(buff, &end_ptr, 0);
        
if (ERANGE == errno) {
  puts("number out of range\n");
}
else if (long_var > INT_MAX) {
  printf("%ld too large!\n", long_var);
}
else if (long_var < INT_MIN) {
  printf("%ld too small!\n", long_var);
}
else if (end_ptr == buff) {
  printf("not valid numeric input\n");
}
else {
  int_var = (int)long_var;
}

References