---
name: "tolower_l"
section: "3"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd"]
url: "https://new.carta.tech/toupper"
---

# tolower\_l(3)

convert uppercase or lowercase

Part of [toupper(3)](/toupper/3.md).

## NAME

toupper, tolower, toupper\_l, tolower\_l - convert uppercase or lowercase

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <ctype.h>
```

**int toupper(int** *c***);** **int tolower(int** *c***);**

**int toupper\_l(int** *c***, locale\_t** *locale***);** **int tolower\_l(int** *c***, locale\_t** *locale***);**

Feature Test Macro Requirements for glibc (see [**feature\_test\_macros**(7)](/feature_test_macros/7.md)):

**toupper\_l**(), **tolower\_l**():

```
    Since glibc 2.10:
        _XOPEN_SOURCE >= 700
    Before glibc 2.10:
        _GNU_SOURCE
```

## DESCRIPTION

These functions convert lowercase letters to uppercase, and vice versa.

If *c* is a lowercase letter, **toupper**() returns its uppercase equivalent, if an uppercase representation exists in the current locale. Otherwise, it returns *c*. The **toupper\_l**() function performs the same task, but uses the locale referred to by the locale handle *locale*.

If *c* is an uppercase letter, **tolower**() returns its lowercase equivalent, if a lowercase representation exists in the current locale. Otherwise, it returns *c*. The **tolower\_l**() function performs the same task, but uses the locale referred to by the locale handle *locale*.

If *c* is neither an *unsigned char* value nor **EOF**, the behavior of these functions is undefined.

The behavior of **toupper\_l**() and **tolower\_l**() is undefined if *locale* is the special locale object **LC\_GLOBAL\_LOCALE** (see [**duplocale**(3)](/duplocale/3.md)) or is not a valid locale object handle.

## RETURN VALUE

The value returned is that of the converted letter, or *c* if the conversion was not possible.

## ATTRIBUTES

For an explanation of the terms used in this section, see [**attributes**(7)](/attributes/7.md).

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **toupper**(), **tolower**(), **toupper\_l**(), **tolower\_l**() | Thread safety | MT-Safe |

## STANDARDS

- **toupper**() **tolower**()

  C11, POSIX.1-2008.

- **toupper\_l**() **tolower\_l**()

  POSIX.1-2008.

## HISTORY

- **toupper**() **tolower**()

  C89, 4.3BSD, POSIX.1-2001.

- **toupper\_l**() **tolower\_l**()

  POSIX.1-2008.

## NOTES

The standards require that the argument *c* for these functions is either **EOF** or a value that is representable in the type *unsigned char*. If the argument *c* is of type *char*, it must be cast to *unsigned char*, as in the following example:

```
char c;
...
res = toupper((unsigned char) c);
```

This is necessary because *char* may be the equivalent *signed char*, in which case a byte where the top bit is set would be sign extended when converting to *int*, yielding a value that is outside the range of *unsigned char*.

The details of what constitutes an uppercase or lowercase letter depend on the locale. For example, the default **"C"** locale does not know about umlauts, so no conversion is done for them.

In some non-English locales, there are lowercase letters with no corresponding uppercase equivalent; the German sharp s is one example.

## SEE ALSO

[**isalpha**(3)](/isalpha/3.md), [**newlocale**(3)](/newlocale/3.md), [**setlocale**(3)](/setlocale/3.md), [**towlower**(3)](/towlower/3.md), [**towupper**(3)](/towupper/3.md), [**uselocale**(3)](/uselocale/3.md), [**locale**(7)](/locale/7.md)
