ctype.h trong C

ctype.h trong C

Header file có tên ctype.h của Thư viện C khai báo một số hàm khá hữu ích cho việc kiểm tra và ánh xạ các ký tự.

Tất cả các hàm này nhận Hàm int như là một tham số, mà có giá trị phải là EOF hoặc có thể biểu diễn như là một unsigned char.

Tất cả hàm này trả về true (khác 0) nếu tham số c thỏa mãn điều kiện đã được mô tả, và false (0) nếu không thỏa mãn.

Ghi chú: Để tìm hiểu các lớp ký tự (ví dụ: lớp ký tự Punctuation, lớp ký tự graphical, lớp ký tự điều khiển...) là bao gồm các ký tự nào, mời bạn theo dõi ở phần cuối trang này.

Các hàm được định nghĩa trong ctype.h

Sau đây là một số hàm được định nghĩa trong ctype.h trong Thư viện C. Bạn theo link để tìm hiểu chi tiết các hàm này.

HàmMô tả
Hàm int isalnum(int c)

Hàm này kiểm tra xem ký tự đã truyền có phải là chữ-số không

Hàm int isalpha(int c)

Hàm này kiểm tra xem ký tự đã truyền có phải là chữ cái không

Hàm int iscntrl(int c)

Hàm này kiểm tra xem ký tự đã truyền có phải là ký tự điều khiển không

Hàm int isdigit(int c)

Hàm này kiểm tra xem ký tự đã truyền có phải là chữ số thập phân không

Hàm int isgraph(int c)

Hàm này kiểm tra xem ký tự đã truyền có phải là ký tự graphical với Locale đã cho không

Hàm int islower(int c)

Hàm này kiểm tra xem ký tự đã truyền có phải là một chữ thường không

Hàm int isprint(int c)

Hàm này kiểm tra xem ký tự đã truyền có thể in được không

Hàm int ispunct(int c)

Hàm này kiểm tra xem ký tự đã truyền có phải là một punctuation char không

Hàm int isspace(int c)

Hàm này kiểm tra xem ký tự đã truyền có phải là white-space

Hàm int isupper(int c)

Hàm này kiểm tra xem ký tự đã truyền có phải là một chữ hoa không

Hàm int isxdigit(int c)

Hàm này kiểm tra xem ký tự đã truyền có phải là ký tự thập lục phân không

1. Hàm int isalnum(int c)

Hàm isalnum() trong C

Hàm void isalnum(int c) trong Thư viện C kiểm tra xem ký tự đã truyền có phải là ký tự - số hay không.

Khai báo hàm isalnum() trong C

Dưới đây là phần khai báo cho hàm isalnum() trong C.

int isalnum(int c);

Tham số

c − Đây là ký tự để được kiểm tra

Trả về giá trị

Hàm này trả về giá trị khác 0 nếu c là một số hoặc một chữ cái, nếu không thì nó trả về 0.

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm isalnum() trong C.

#include <stdio.h>
#include <ctype.h>

int main()
{
int var1 = 'd';
int var2 = '2';
int var3 = '\t';
int var4 = ' ';

if( isalnum(var1) )
{
printf("var1 = |%c| la ky tu-so\n", var1 );
}
else
{
printf("var1 = |%c| khong phai la ky tu-so\n", var1 );
}

if( isalnum(var2) )
{
printf("var2 = |%c| la ky tu-so\n", var2 );
}
else
{
printf("var2 = |%c| khong phai la ky tu-so\n", var2 );
}

if( isalnum(var3) )
{
printf("var3 = |%c| la ky tu-so\n", var3 );
}
else
{
printf("var3 = |%c| khong phai la ky tu-so\n", var3 );
}

if( isalnum(var4) )
{
printf("var4 = |%c| la ky tu-so\n", var4 );
}
else
{
printf("var4 = |%c| khong phai la ky tu-so\n", var4 );
}
return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Hàm int isalnum(int c)

2. Hàm isalpha() trong C

Hàm isalpha() trong C

Hàm void isalpha(int c) trong Thư viện C kiểm tra xem ký tự đã truyền có phải là chữ cái không.

Khai báo hàm isalpha() trong C

Dưới đây là phần khai báo cho hàm isalpha() trong C:

int isalpha(int c);

Tham số

c − Đây là ký tự để được kiểm tra.

Trả về giá trị

Hàm này trả về giá trị khác 0 nếu c là một chữ cái, nếu không, hàm trả về 0.

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm isalpha() trong C:

#include <stdio.h>
#include <ctype.h>

int main()
{
   int var1 = 'd';
   int var2 = '2';
   int var3 = '\t';
   int var4 = ' ';
    
   if( isalpha(var1) )
   {
      printf("var1 = |%c| la mot chu cai\n", var1 );
   }
   else
   {
      printf("var1 = |%c| khong phai la mot chu cai\n", var1 );
   }
   
   if( isalpha(var2) )
   {
      printf("var2 = |%c| la mot chu cai\n", var2 );
   }
   else
   {
      printf("var2 = |%c| khong phai la mot chu cai\n", var2 );
   }
   
   if( isalpha(var3) )
   {
      printf("var3 = |%c| la mot chu cai\n", var3 );
   }
   else
   {
      printf("var3 = |%c| khong phai la mot chu cai\n", var3 );
   }
   
   if( isalpha(var4) )
   {
      printf("var4 = |%c| la mot chu cai\n", var4 );
   }
   else
   {
      printf("var4 = |%c| khong phai la mot chu cai\n", var4 );
   }
   
   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Hàm isalpha() trong C

3. Hàm iscntrl() trong C

Hàm iscntrl() trong C

Hàm void iscntrl(int c) trong Thư viện C kiểm tra xem ký tự đã truyền có phải là ký tự điều khiển không

Theo bộ ký tự ASCII chuẩn, các ký tự điều khiển có mã hóa ASCII là 0x00 (NUL), 0x1f (US), và 0x7f (DEL). Một số trình triển khai riêng của một số nền tảng cụ thể có thể định nghĩa một số ký tự điều khiển bổ sung trong bộ ký tự mở rộng (trên 0x7f).

Khai báo hàm iscntrl() trong C

Dưới đây là phần khai báo cho hàm iscntrl() trong C:

int iscntrl(int c);

Tham số

c − Đây là ký tự để được kiểm tra.

Trả về giá trị

Hàm này trả về giá trị khác 0 nếu c là một ký tự điều khiển. Nếu không, hàm trả về 0.

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm iscntrl() trong C:

#include <stdio.h>
#include <ctype.h>

int main ()
{
   int i = 0, j = 0;
   char str1[] = "Hoc \a lap trinh \t hay nhat";
   char str2[] = "tai \n QTM";
  
   /* in chuoi cho toi khi gap ky tu \a */
   while( !iscntrl(str1[i]) ) 
   {
      putchar(str1[i]);
      i++;
   }
  
   /* in chuoi cho toi khi gap ky tu \n */
   while( !iscntrl(str2[j]) ) 
   {
      putchar(str2[j]);
      j++;
   }
   
   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Hàm iscntrl() trong C

4. Hàm isdigit() trong C

Hàm isdigit() trong C

Hàm void isdigit(int c) trong Thư viện C kiểm tra xem ký tự đã truyền có phải là chữ số thập phân không.

Các chữ số thập phân bao gồm − 0 1 2 3 4 5 6 7 8 9.

Khai báo hàm isdigit() trong C

Dưới đây là phần khai báo cho hàm isdigit() trong C:

int isdigit(int c);

Tham số

c − Đây là ký tự để được kiểm tra.

Trả về giá trị

Hàm này trả về giá trị khác 0 nếu c là một chữ số. Nếu không, hàm trả về 0.

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm isdigit() trong C:

#include <stdio.h>
#include <ctype.h>

int main()
{
   int var1 = 'h';
   int var2 = '2';
    
   if( isdigit(var1) )
   {
      printf("var1 = |%c| la mot ky so\n", var1 );
   }
   else
   {
      printf("var1 = |%c| khong phai la mot ky so\n", var1 );
   }
   
   if( isdigit(var2) )
   {
      printf("var2 = |%c| la mot ky so\n", var2 );
   }
   else
   {
      printf("var2 = |%c| khong phai la mot ky so\n", var2 );
   }
   
   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Hàm isdigit() trong C

5. Hàm isgraph() trong C

Hàm isgraph() trong C

Hàm void isgraph(int c) trong Thư viện C kiểm tra xem ký tự đã truyền có phải là ký tự graphical với Locale đã cho không.

Ký tự graphical là một tập hợp gồm Ký tự chữ-số và ký tự punctuation

Khai báo hàm isgraph() trong C

Dưới đây là phần khai báo cho hàm isgraph() trong C:

int isgraph(int c);

Tham số

c − Đây là ký tự để được kiểm tra.

Trả về giá trị

Hàm này trả về giá trị khác 0 nếu c là một ký tự graphical. Nếu không, hàm trả về 0.

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm isgraph() trong C:

#include <stdio.h>
#include <ctype.h>

int main()
{
   int var1 = '3';
   int var2 = 'm';
   int var3 = ' ';
    
   if( isgraph(var1) )
   {
      printf("var1 = |%c| la co the in duoc\n", var1 );
   }
   else
   {
      printf("var1 = |%c| la khong the in duoc\n", var1 );
   }
   
   if( isgraph(var2) )
   {
      printf("var2 = |%c| la co the in duoc\n", var2 );
   }
   else
   {
      printf("var2 = |%c| la khong the in duoc\n", var2 );
   }
   
   if( isgraph(var3) )
   {
      printf("var3 = |%c| la co the in duoc\n", var3 );
   }
   else
   {
      printf("var3 = |%c| la khong the in duoc\n", var3 );
   }
   
   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Hàm isgraph() trong C

6. Hàm islower() trong C

Hàm islower() trong C

Hàm int islower(int c) trong Thư viện C kiểm tra xem ký tự đã truyền có phải là một chữ thường không.

Khai báo hàm islower() trong C

Dưới đây là phần khai báo cho hàm islower() trong C:

int islower(int c);

Tham số

c − Đây là ký tự để được kiểm tra.

Trả về giá trị

Hàm này trả về giá trị khác 0 (true) nếu c là chữ cái thường. Nếu không hàm trả về 0 (false).

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm islower() trong C:

#include <stdio.h>
#include <ctype.h>

int main()
{
   int var1 = 'Q';
   int var2 = 'q';
   int var3 = '3';
    
   if( islower(var1) )
   {
      printf("var1 = |%c| la mot  ky tu chu thuong\n", var1 );
   }
   else
   {
      printf("var1 = |%c| khong phai la mot ky tu chu thuong\n", var1 );
   }
   
   if( islower(var2) )
   {
      printf("var2 = |%c| la mot  ky tu chu thuong\n", var2 );
   }
   else
   {
      printf("var2 = |%c| khong phai la mot ky tu chu thuong\n", var2 );
   }
   
   if( islower(var3) )
   {
      printf("var3 = |%c| la mot  ky tu chu thuong\n", var3 );
   }
   else
   {
      printf("var3 = |%c| khong phai la mot ky tu chu thuong\n", var3 );
   }
   
   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Hàm islower() trong C

7. Hàm isprint() trong C

Hàm isprint() trong C

Hàm int isprint(int c) trong Thư viện C kiểm tra xem ký tự đã truyền có thể in được không. Một ký tự có thể in được là ký tự không phải là ký tự điều khiển.

Khai báo hàm isprint() trong C

Dưới đây là phần khai báo cho hàm isprint() trong C:

int isprint(int c);

Tham số

c − Đây là ký tự để được kiểm tra.

Trả về giá trị

Hàm này trả về giá trị khác 0 (true) nếu c là ký tự có thể in được. Nếu không hàm trả về 0 (false).

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm isprint() trong C:

#include <stdio.h>
#include <ctype.h>

int main()
{
   int var1 = 'k';
   int var2 = '8';
   int var3 = '\t';
   int var4 = ' ';
    
   if( isprint(var1) )
   {
      printf("var1 = |%c| co the in duoc\n", var1 );
   }
   else
   {
      printf("var1 = |%c| khong the in duoc\n", var1 );
   }
   
   if( isprint(var2) )
   {
      printf("var2 = |%c| co the in duoc\n", var2 );
   }
   else
   {
      printf("var2 = |%c| khong the in duoc\n", var2 );
   }
   
   if( isprint(var3) )
   {
      printf("var3 = |%c| co the in duoc\n", var3 );
   }
   else
   {
      printf("var3 = |%c| khong the in duoc\n", var3 );
   }
   
   if( isprint(var4) )
   {
      printf("var4 = |%c| co the in duoc\n", var4 );
   }
   else
   {
      printf("var4 = |%c| khong the in duoc\n", var4 );
   }
   
   return(0);
}   

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Hàm isprint() trong C

8. Hàm ispunct() trong C

Hàm ispunct() trong C

Hàm int ispunct(int c) trong Thư viện C kiểm tra xem ký tự đã truyền có phải là một punctuation char không. Ký tự punctuation là tập hợp gồm ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~

Khai báo hàm ispunct() trong C

Dưới đây là phần khai báo cho hàm ispunct() trong C:

int ispunct(int c);

Tham số

c − Đây là ký tự để được kiểm tra.

Trả về giá trị

Hàm này trả về giá trị khác 0 (true) nếu c là ký tự punctuation. Nếu không hàm trả về 0 (false).

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm ispunct() trong C:

#include <stdio.h>
#include <ctype.h>

int main()
{
   int var1 = 't';
   int var2 = '1';
   int var3 = '/';
   int var4 = ' ';

   if( ispunct(var1) )
   {
      printf("var1 = |%c| la mot ky tu punctuation\n", var1 );
   }
   else
   {
      printf("var1 = |%c| khong phai la mot ky tu punctuation\n", var1 );
   }
   
   if( ispunct(var2) )
   {
      printf("var2 = |%c| la mot ky tu punctuation\n", var2 );
   }
   else
   {
      printf("var2 = |%c| khong phai la mot ky tu punctuation\n", var2 );
   }
   
   if( ispunct(var3) )
   {
      printf("var3 = |%c| la mot ky tu punctuation\n", var3 );
   }
   else
   {
      printf("var3 = |%c| khong phai la mot ky tu punctuation\n", var3 );
   }
   
   if( ispunct(var4) )
   {
      printf("var4 = |%c| la mot ky tu punctuation\n", var4 );
   }
   else
   {
      printf("var4 = |%c| khong phai la mot ky tu punctuation\n", var4 );
   }
   
   return(0);
}   

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

 Hàm ispunct() trong C

9. Hàm isspace() trong C

Hàm isspace() trong C

Hàm int isspace(int c) trong Thư viện C kiểm tra xem ký tự đã truyền có phải là white-space.

Dưới đây là các ký tự whitespace trong Thư viện C:

' '   (0x20)	khong trng (SPC)
'\t'	(0x09)	tab ngang (TAB)
'\n'	(0x0a)	newline (dòng mi) - dòng mi (LF)
'\v'	(0x0b)	tab doc (VT)
'\f'	(0x0c)	feed (FF)
'\r'	(0x0d)	carriage return (CR)

Khai báo hàm isspace() trong C

Dưới đây là phần khai báo cho hàm isspace() trong C:

int isspace(int c);

Tham số

c − Đây là ký tự để được kiểm tra.

Trả về giá trị

Hàm này trả về giá trị khác 0 (true) nếu c là ký tự whitespace. Nếu không hàm trả về 0 (false).

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm isspace() trong C:

#include <stdio.h>
#include <ctype.h>

int main()
{
   int var1 = 't';
   int var2 = '1';
   int var3 = ' ';

   if( isspace(var1) )
   {
      printf("var1 = |%c| la mot khoang trang\n", var1 );
   }
   else
   {
      printf("var1 = |%c| khong phai la mot khoang trang\n", var1 );
   }
   
   if( isspace(var2) )
   {
      printf("var2 = |%c| la mot khoang trang\n", var2 );
   }
   else
   {
      printf("var2 = |%c| khong phai la mot khoang trang\n", var2 );
   }
   
   if( isspace(var3) )
   {
      printf("var3 = |%c| la mot khoang trang\n", var3 );
   }
   else
   {
      printf("var3 = |%c| khong phai la mot khoang trang\n", var3 );
   }
   
   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Hàm isspace() trong C

10. Hàm isupper() trong C

Hàm isupper() trong C

Hàm int isupper(int c) trong Thư viện C kiểm tra xem ký tự đã truyền có phải là một chữ hoa không.

Khai báo hàm isupper() trong C

Dưới đây là phần khai báo cho hàm isupper() trong C:

int isupper(int c);

Tham số

c − Đây là ký tự để được kiểm tra.

Trả về giá trị

Hàm này trả về giá trị khác 0 (true) nếu c là chữ hoa. Nếu không hàm trả về 0 (false).

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm isupper() trong C:

#include <stdio.h>
#include <ctype.h>

int main()
{
   int var1 = 'M';
   int var2 = 'm';
   int var3 = '3';
    
   if( isupper(var1) )
   {
      printf("var1 = |%c| la mot ky tu chu hoa\n", var1 );
   }
   else
   {
      printf("var1 = |%c| khong phai la mot ky tu chu hoa\n", var1 );
   }
   
   if( isupper(var2) )
   {
      printf("var2 = |%c| la mot ky tu chu hoa\n", var2 );
   }
   else
   {
      printf("var2 = |%c| khong phai la mot ky tu chu hoa\n", var2 );
   }   
   
   if( isupper(var3) )
   {
      printf("var3 = |%c| la mot ky tu chu hoa\n", var3 );
   }
   else
   {
      printf("var3 = |%c| khong phai la mot ky tu chu hoa\n", var3 );
   }
   
   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

 Hàm isupper() trong C

11. Hàm isxdigit() trong C

Hàm isxdigit() trong C

Hàm int isxdigit(int c) trong Thư viện C kiểm tra xem ký tự đã truyền có phải là ký tự thập lục phân (ký tự hexa) không.

Khai báo hàm isxdigit() trong C

Dưới đây là phần khai báo cho hàm isxdigit() trong C:

int isxdigit(int c);

Tham số

c − Đây là ký tự để được kiểm tra.

Trả về giá trị

Hàm này trả về giá trị khác 0 (true) nếu c là ký tự thập lục phân. Nếu không hàm trả về 0 (false).

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm isxdigit() trong C:

#include <stdio.h>
#include <ctype.h>

int main()
{
   char var1[] = "tuts";
   char var2[] = "0xE";
  
   if( isxdigit(var1[0]) )
   {
      printf("var1 = |%s| la mot ky tu hexa\n", var1 );
   }
   else
   {
      printf("var1 = |%s| khong phai la mot ky tu hexa\n", var1 );
   }
   
   if( isxdigit(var2[0] ))
   {
      printf("var2 = |%s| la mot ky tu hexa\n", var2 );
   }
   else
   {
      printf("var2 = |%s| khong phai la mot ky tu hexa\n", var2 );
   }
   
   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Hàm isxdigit() trong C

Thư viện ctye.h cũng chứa hai hàm chuyển đổi mà nhận và trả về một int:

Hàm int tolower(int c) - Hàm này chuyển đổi các chữ cái hoa thành chữ thường

Hàm int toupper(int c) - Hàm này chuyển đổi các chữ cái thường thành chữ hoa

12. Hàm tolower() trong C

Hàm tolower() trong C

Hàm int tolower(int c) trong Thư viện C chuyển đổi ký tự đã cho thành chữ thường.

Khai báo hàm tolower() trong C

Dưới đây là phần khai báo cho hàm tolower() trong C:

int tolower(int c);

Tham số

c − Đây là ký tự để được chuyển đổi thành chữ thường.

Trả về giá trị

Hàm này trả về chữ cái thường tương đương với c nếu giá trị đó tồn tại, nếu không c sẽ không thay đổi. Giá trị được trả về dưới dạng một giá trị int mà có thể được ép kiểu ngầm định thành char.

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm tolower() trong C:

#include <stdio.h>
#include <ctype.h>

int main()
{
   int i = 0;
   char c;
   char str[] = "TUTORIALS POINT";
	
   while( str[i] ) 
   {
      putchar(tolower(str[i]));
      i++;
   }
   
   return(0);
}

Biên dịch và chạy chương trình C trên để xem kết quả:

13. Hàm toupper() trong C

Hàm toupper() trong C

Hàm int toupper(int c) trong Thư viện C chuyển đổi các chữ cái thường thành chữ hoa.

Khai báo hàm toupper() trong C

Dưới đây là phần khai báo cho hàm toupper() trong C:

int toupper(int c);

Tham số

c − Đây là ký tự để được chuyển đổi thành chữ hoa.

Trả về giá trị

Hàm này trả về chữ cái hoa tương đương với c nếu giá trị đó tồn tại, nếu không c sẽ không thay đổi. Giá trị được trả về dưới dạng một giá trị int mà có thể được ép kiểu ngầm định thành char.

Ví dụ

Chương trình C sau minh họa cách sử dụng của hàm toupper() trong C:

#include <stdio.h>
#include <ctype.h>

int main()
{
   int i = 0;
   char c;
   char str[] = "Tutorials Point";
   
   while(str[i])
   {
      putchar (toupper(str[i]));
      i++;
   }
   
   return(0);
}

Biên dịch và chạy chương trình C để xem kết quả:

Giải thích một số lớp ký tự

Lớp ký tựMô tả
Chữ số

Đây là tập hợp tất cả các số { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }

Chữ số thập lục phân

Đây là tập hợp gồm { 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f }

Chữ cái thường

Là tập hợp gồm tất cả chữ cái thường { a b c d e f g h i j k l m n o p q r s t u v w x y z }

Chữ cái hoa

Là tập hợp gồm tất cả chữ cái hoa {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z }

Chữ cái

Là tập hợp gồm tất cả chữ cái hoa và thường

Ký tự chữ-số

Là một tập hợp gồm chữ số, Ký tự chữ hoa và thường

Ký tự Punctuation

Là tập hợp gồm ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~

Ký tự Graphical

Là một tập hợp gồm Ký tự chữ-số và ký tự punctuation

Ký tự whitespace

Là tập hợp gồm tab, newline (dòng mới), vertical tab, form feed, carriage return, và space

Ký tự có thể in được

Là tập hợp gồm Ký tự chữ-số, Ký tự punctuation và Ký tự whitespace

Ký tự điều khiển

Trong ASCII, các ký tự này có các mã hóa trong hệ bát phân từ 000 tới 037, và 177 (DEL)

Ký tự Blank

Các ký tự này gồm các ký tự space và tab

Ký tự chữ cái

Là tập hợp gồm các ký tự chữ hoa và chữ thường

Theo Tutorialspoint

Bài trước: assert.h trong C

Bài tiếp: errno.h trong C

Thứ Sáu, 17/08/2018 11:36
52 👨 14.607
0 Bình luận
Sắp xếp theo
    ❖ Lập trình C