Arduino 简明教程

Arduino - Character Functions

所有数据都以字符的形式输入计算机,其中包括字母、数字和各种特殊符号。在本节中,我们将讨论 C++ 检查和操作各个字符的能力。

字符处理库包括几个执行有用的字符数据测试和操作的函数。每个函数接收一个表示为 int 的字符,或将 EOF 作为参数。字符通常被作为整数进行操作。

请记住,EOF 通常具有值 –1,并且某些硬件体系结构不允许将负值存储在 char 变量中。因此,字符处理函数将字符作为整数来处理。

下表总结了字符处理库的函数。当使用字符处理库中的函数时,请包含 <cctype> 头。

S.No.

Prototype & Description

1

int isdigit( int c ) 如果 c 是一个数字,则返回 1,否则返回 0。

2

int isalpha( int c ) 如果 c 是一个字母,则返回 1,否则返回 0。

3

int isalnum( int c ) 如果 c 是一个数字或字母,则返回 1,否则返回 0。

4

int isxdigit( int c ) 如果 c 是一个十六进制数字字符,则返回 1,否则返回 0。(有关二进制数、八进制数、十进制数和十六进制数的详细解释,请参见附录 D,数字系统。)

5

int islower( int c ) 如果 c 是一个小写字母,则返回 1,否则返回 0。

6

int isupper( int c ) 如果 c 是一个大写字母,则返回 1;否则返回 0。

7

int isspace( int c ) 如果 c 是一个空白字符(换行 ('\n')、空格(' ')、换页 ('\f')、回车 ('\r')、水平制表符 ('\t') 或垂直制表符 ('\v'))则返回 1,否则返回 0。

8

int iscntrl( int c ) 如果 c 是一个控制字符,例如换行 ('\n')、换页 ('\f')、回车 ('\r')、水平制表符 ('\t')、垂直制表符 ('\v')、警告 ('\a') 或退格 ('\b'),则返回 1,否则返回 0。

9

int ispunct( int c ) 如果 c 是空格、数字或字母之外的打印字符,则返回 1,否则返回 0。

10

int isprint( int c ) 如果 c 是打印字符(包括空格 (' ')),则返回 1,否则返回 0。

11

int isgraph( int c ) 如果 c 是空格 (' ') 之外的打印字符,则返回 1,否则返回 0。

Examples

以下示例演示了函数 isdigit, isalpha, isalnumisxdigit 的用法。函数 isdigit 确定其参数是否是数字 (0-9)。函数 isalpha 确定其参数是否是仅大写字母 (A-Z) 或仅小写字母 (a-z)。函数 isalnum 确定其参数是否是仅大写字母、仅小写字母或数字。函数 isxdigit 确定其参数是否是十六进制数字 (A-F, a-f, 0-9)。

Example 1

void setup () {
   Serial.begin (9600);
   Serial.print ("According to isdigit:\r");
   Serial.print (isdigit( '8' ) ? "8 is a": "8 is not a");
   Serial.print (" digit\r" );
   Serial.print (isdigit( '8' ) ?"# is a": "# is not a") ;
   Serial.print (" digit\r");
   Serial.print ("\rAccording to isalpha:\r" );
   Serial.print (isalpha('A' ) ?"A is a": "A is not a");
   Serial.print (" letter\r");
   Serial.print (isalpha('A' ) ?"b is a": "b is not a");
   Serial.print (" letter\r");
   Serial.print (isalpha('A') ?"& is a": "& is not a");
   Serial.print (" letter\r");
   Serial.print (isalpha( 'A' ) ?"4 is a":"4 is not a");
   Serial.print (" letter\r");
   Serial.print ("\rAccording to isalnum:\r");
   Serial.print (isalnum( 'A' ) ?"A is a" : "A is not a" );

   Serial.print (" digit or a letter\r" );
   Serial.print (isalnum( '8' ) ?"8 is a" : "8 is not a" ) ;
   Serial.print (" digit or a letter\r");
   Serial.print (isalnum( '#' ) ?"# is a" : "# is not a" );
   Serial.print (" digit or a letter\r");
   Serial.print ("\rAccording to isxdigit:\r");
   Serial.print (isxdigit( 'F' ) ?"F is a" : "F is not a" );
   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( 'J' ) ?"J is a" : "J is not a" ) ;
   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( '7' ) ?"7 is a" : "7 is not a" ) ;

   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( '$' ) ? "$ is a" : "$ is not a" );
   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( 'f' ) ? “f is a" : "f is not a");

}

void loop () {

}

Result

According to isdigit:
8 is a digit
# is not a digit
According to isalpha:
A is a letter
b is a letter
& is not a letter
4 is not a letter
According to isalnum:
A is a digit or a letter

8 is a digit or a letter
# is not a digit or a letter
According to isxdigit:
F is a hexadecimal digit
J is not a hexadecimal digit
7 is a hexadecimal digit

$ is not a hexadecimal digit
f is a hexadecimal digit

我们对每个函数使用条件运算符 (?:) 来确定字符串 " 是一个 " 或字符串 " 不是一个 " 的内容是否应打印在每个所测试字符的输出中。例如,行 a 表明如果 '8' 是一个数字 - 即如果 isdigit 返回 true(非零)值 - 则打印字符串 "8 是一个 "。如果 '8' 不是一个数字(即如果 isdigit 返回 0),则打印字符串 " 8 不是一个 "。

Example 2

以下示例演示了函数 islowerisupper 的用法。函数 islower 确定其参数是否是仅小写字母 (a-z)。函数 isupper 确定其参数是否是仅大写字母 (A-Z)。

int thisChar = 0xA0;

void setup () {
   Serial.begin (9600);
   Serial.print ("According to islower:\r") ;
   Serial.print (islower( 'p' ) ? "p is a" : "p is not a" );
   Serial.print ( " lowercase letter\r" );
   Serial.print ( islower( 'P') ? "P is a" : "P is not a") ;
   Serial.print ("lowercase letter\r");
   Serial.print (islower( '5' ) ? "5 is a" : "5 is not a" );
   Serial.print ( " lowercase letter\r" );
   Serial.print ( islower( '!' )? "! is a" : "! is not a") ;
   Serial.print ("lowercase letter\r");

   Serial.print ("\rAccording to isupper:\r") ;
   Serial.print (isupper ( 'D' ) ? "D is a" : "D is not an" );
   Serial.print ( " uppercase letter\r" );
   Serial.print ( isupper ( 'd' )? "d is a" : "d is not an") ;
   Serial.print ( " uppercase letter\r" );
   Serial.print (isupper ( '8' ) ? "8 is a" : "8 is not an" );
   Serial.print ( " uppercase letter\r" );
   Serial.print ( islower( '$' )? "$ is a" : "$ is not an") ;
   Serial.print ("uppercase letter\r ");
}

void setup () {

}

Result

According to islower:
p is a lowercase letter
P is not a lowercase letter
5 is not a lowercase letter
! is not a lowercase letter

According to isupper:
D is an uppercase letter
d is not an uppercase letter
8 is not an uppercase letter
$ is not an uppercase letter

Example 3

以下示例演示了函数 isspace, iscntrl, ispunct, isprintisgraph 的用法。

  1. 函数 isspace 确定其参数是否是空白字符,例如空格 (' ')、换页 ('\f')、换行 ('\n')、回车 ('\r')、水平制表符 ('\t') 或垂直制表符 ('\v')。

  2. 函数 iscntrl 确定其参数是否是控制字符,例如水平制表符 ('\t')、垂直制表符 ('\v')、换页 ('\f')、警告 ('\a')、退格 ('\b')、回车 ('\r') 或换行 ('\n')。

  3. 函数 ispunct 确定其参数是否是空格、数字或字母之外的打印字符,例如 $, #, (, ), [, ], {, }, ;, : 或 %。

  4. 函数 isprint 确定其参数是否是可在屏幕上显示的字符(包括空格字符)。

  5. 函数 isgraph 对与 isprint 相同的字符进行测试,但不包括空格字符。

void setup () {
   Serial.begin (9600);
   Serial.print ( " According to isspace:\rNewline ") ;
   Serial.print (isspace( '\n' )? " is a" : " is not a" );
   Serial.print ( " whitespace character\rHorizontal tab") ;
   Serial.print (isspace( '\t' )? " is a" : " is not a" );
   Serial.print ( " whitespace character\n") ;
   Serial.print (isspace('%')? " % is a" : " % is not a" );

   Serial.print ( " \rAccording to iscntrl:\rNewline") ;
   Serial.print ( iscntrl( '\n' )?"is a" : " is not a" ) ;
   Serial.print (" control character\r");
   Serial.print (iscntrl( '$' ) ? " $ is a" : " $ is not a" );
   Serial.print (" control character\r");
   Serial.print ("\rAccording to ispunct:\r");
   Serial.print (ispunct(';' ) ?"; is a" : "; is not a" ) ;
   Serial.print (" punctuation character\r");
   Serial.print (ispunct('Y' ) ?"Y is a" : "Y is not a" ) ;
   Serial.print ("punctuation character\r");
   Serial.print (ispunct('#' ) ?"# is a" : "# is not a" ) ;
   Serial.print ("punctuation character\r");

   Serial.print ( "\r According to isprint:\r");
   Serial.print (isprint('$' ) ?"$ is a" : "$ is not a" );
   Serial.print (" printing character\rAlert ");
   Serial.print (isprint('\a' ) ?" is a" : " is not a" );
   Serial.print (" printing character\rSpace ");
   Serial.print (isprint(' ' ) ?" is a" : " is not a" );
   Serial.print (" printing character\r");

   Serial.print ("\r According to isgraph:\r");
   Serial.print (isgraph ('Q' ) ?"Q is a" : "Q is not a" );
   Serial.print ("printing character other than a space\rSpace ");
   Serial.print (isgraph (' ') ?" is a" : " is not a" );
   Serial.print ("printing character other than a space ");
}

void loop () {

}

Result

According to isspace:
Newline is a whitespace character
Horizontal tab is a whitespace character
% is not a whitespace character
According to iscntrl:
Newline is a control character
$ is not a control character
According to ispunct:
; is a punctuation character
Y is not a punctuation character
# is a punctuation character
According to isprint:
$ is a printing character
Alert is not a printing character
Space is a printing character
According to isgraph:
Q is a printing character other than a space
Space is not a printing character other than a space