C 语言入门/C 字符串函数库
字符串函数库需要声明
#include <string.h>
最重要的字符串函数如下
strlen() Get length of a string. strcpy() Copy one string to another. strcat() Link together (concatenate) two strings. strcmp() Compare two strings. strchr() Find character in string. strstr() Find string in string. strlwr() Convert string to lowercase. strupr() Convert string to uppercase.
"strlen()" 函数给出字符串的长度,不包括末尾的 NUL 字符
/* strlen.c */
#include <stdio.h>
#include <string.h>
int main()
{
char *t = "XXX";
printf( "Length of <%s> is %d.\n", t, strlen( t ));
}
这会打印
Length of <XXX> is 3.
"strcpy" 函数从另一个字符串复制一个字符串。例如
/* strcpy.c */
#include <stdio.h>
#include <string.h>
int main()
{
char s1[100],
s2[100];
strcpy( s1, "xxxxxx 1" );
strcpy( s2, "zzzzzz 2" );
puts( "Original strings: " );
puts( "" );
puts( s1 );
puts( s2 );
puts( "" );
strcpy( s2, s1 );
puts( "New strings: " );
puts( "" );
puts( s1 );
puts( s2 );
}
这将打印
Original strings: xxxxxx 1 zzzzzz 2 New strings: xxxxxx 1 xxxxxx 1
请注意此程序的两个特点
- 此程序假设 "s2" 有足够的空间来存储最终的字符串。如果情况并非如此,"strcpy()" 函数不会检查,并会给出错误的结果。
- 字符串常量可以用作源字符串,而不是字符串变量。当然,使用字符串常量作为目标没有任何意义。
这些注释适用于大多数其他字符串函数。
"strcpy" 的变体形式名为 "strncpy",它将复制源字符串的 "n" 个字符到目标字符串,假设源字符串中有那么多个字符可用。例如,如果在示例程序中进行以下更改
strncpy( s2, s1, 5 );
——那么结果将变为
New strings: xxxxxx 1 xxxxxz 2
注意,参数 "n" 被声明为 "size_t",它在 "string.h" 中定义。因为在头 5 个字符中没有空字节,所以 strncpy 在复制后不会添加 '\0'。
"strcat()" 函数连接两个字符串
/* strcat.c */
#include <stdio.h>
#include <string.h>
int main()
{
char s1[50],
s2[50];
strcpy( s1, "Tweedledee " );
strcpy( s2, "Tweedledum" );
strcat( s1, s2 );
puts( s1 );
}
这会打印
Tweedledee Tweedledum
"strcat()" 的变体版本名为 "strncat()",它将向目标字符串追加源字符串的 "n" 个字符。如果上面的示例使用了 "strncat()" 且长度为 7
strncat( s1, s2, 7 );
——结果将是
Tweedledee Tweedle
同样,长度参数的类型为 "size_t"。
"strcmp()" 函数比较两个字符串
/* strcmp.c */
#include <stdio.h>
#include <string.h>
#define ANSWER "blue"
int main()
{
char t[100];
puts( "What is the secret color?" );
gets( t );
while ( strcmp( t, ANSWER ) != 0 )
{
puts( "Wrong, try again." );
gets( t );
}
puts( "Right!" );
}
"strcmp()" 函数在比较成功时返回 0,否则返回非零值。比较区分大小写,因此回答 "BLUE" 或 "Blue" 不会有效。
"strcmp()" 有三种替代形式
- "strncmp()" 函数,顾名思义,它比较源字符串和目标字符串中的 "n" 个字符
"strncmp( s1, s2, 6 )".
- "stricmp()" 函数忽略比较中的大小写。
- "strncmp" 的不区分大小写的版本称为 "strnicmp"。
"strchr" 函数在字符串中查找字符的第一次出现。如果找到,它返回指向该字符的指针,如果没有找到,则返回 NULL。例如
/* strchr.c */
#include <stdio.h>
#include <string.h>
int main()
{
char *t = "MEAS:VOLT:DC?";
char *p;
p = t;
puts( p );
while(( p = strchr( p, ':' )) != NULL )
{
puts( ++p );
}
}
这会打印
MEAS:VOLT:DC? VOLT:DC? DC?
字符被定义为字符常量,C 将其视为 "int"。注意示例程序如何在使用它之前递增指针 ("++p"),以便它不指向 ":",而是指向它后面的字符。
"strrchr()" 函数与 "strchr()" 几乎相同,只是它搜索字符串中字符的最后一次出现。
"strstr()" 函数类似于 "strchr()",只是它搜索字符串,而不是字符。它也返回一个指针
char *s = "Black White Brown Blue Green";
...
puts( strstr( s, "Blue" ) );
"strlwr()" 和 "strupr()" 函数只是对源字符串执行小写或大写转换。例如
/* casecvt.c */
#include <stdio.h>
#include <string.h>
int main()
{
char *t = "Hey Barney hey!";
puts( strlwr( t ) );
puts( strupr( t ) );
}
——打印
hey barney hey! HEY BARNEY HEY!
这两个函数只在某些编译器中实现,不是 ANSI C 的一部分。