w3resource

C wcstombs() function

C wcstombs() function - Convert a wide-character string to a character string

Syntax wcstombs() function

size_t wcstombs(char *str, const wchar_t *pwcs, size_t n)

The wcstombs() function is used to convert the wide-character string pointed to by string into the multibyte array pointed to by str.

Parameters wcstombs() function

Name Description Required /Optional
str This is the pointer to an array of char elements at least n bytes long. Required
pwcs This is wide-character string to be converted. Required
n This is the maximum number of bytes to be written to str. Required

Return value from wcstombs()

  • If a wide-character code is encountered that does not correspond to a valid character, wcstombs() shall return (size_t)-1.
  • Otherwise, the function returns the number of bytes stored in the character array, not including any terminating null byte.

Example: wcstombs() function

The following example shows the usage of wcstombs() function.

/*Source:https://www.ibm.com/docs/en*/
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
#include <memory.h>
#define  STRLENGTH   10
#define  LOCNAME     "qsys.lib/JA_JP.locale"
#define  LOCNAME_EN  "qsys.lib/EN_US.locale"
int main(void)
{
    char string[STRLENGTH];
    int length, sl = 0;
    wchar_t   wc2[] = L"XYZ";
    wchar_t  wc_string[10];
    mbstate_t ps = 0;
    memset(string, '\0', STRLENGTH);
    wc_string[0] = 0x00C1;
    wc_string[1] = 0x4171;
    wc_string[2] = 0x4172;
    wc_string[3] = 0x00C2;
    wc_string[4] = 0x0000;
    /* In this first example we will convert a wide character string */
    /* to a single byte character string.  We first set the locale   */
    /* to a single byte locale.  We choose a locale with             */
    /* CCSID 37.                                                     */
    if (setlocale(LC_ALL, LOCNAME_EN) == NULL)
        printf("setlocale failed.\n");
    length = wcstombs(string, wc2, 10);
    /* In this case wide characters ABC are converted to */
    /* single byte characters ABC, length is 3.   */
    printf("string = %s, length = %d\n\n", string, length);
    /* Now lets try a multibyte example.  We first must set the */
    /* locale to a multibyte locale.  We choose a locale with     */
    /* CCSID 5026  */
    if (setlocale(LC_ALL, LOCNAME) == NULL)
        printf("setlocale failed.\n");
    length = wcstombs(string, wc_string, 10);
    /* The hex look at string would now be:                    */
    /* C10E417141720FC2   length will be 8                     */
    /* You would need a device capable of displaying multibyte */
    /* characters to see this string.                          */
    printf("length = %d\n\n", length);
}

N.B.: This code is executed in windows 10

Output:

setlocale failed.
string = XYZ, length = 3
setlocale failed.
length = -1

C Programming Code Editor:

Previous C Programming: C mbtowc()
Next C Programming: C wctomb()



Follow us on Facebook and Twitter for latest update.

C Programming: Tips of the Day

What's the point of const pointers?

const is a tool which you should use in pursuit of a very important C++ concept:

Find bugs at compile-time, rather than run-time, by getting the compiler to enforce what you mean.

Even though it does not change the functionality, adding const generates a compiler error when you're doing things you didn't mean to do. Imagine the following typo:

void foo(int* ptr)
{
    ptr = 0;// oops, I meant *ptr = 0
}

If you use int* const, this would generate a compiler error because you're changing the value to ptr. Adding restrictions via syntax is a good thing in general. Just don't take it too far -- the example you gave is a case where most people don't bother using const.

Ref : https://bit.ly/33Cdn3Q