C:字符串

1. 字符串

字符串变量是放在一对双引号中的一串字符或符号。
C中的字符串总是以 \0 字符结束,所以字符串长度永远比字符串中的字符数多1.

C对变量存储字符串的语法没有特殊的规定,而且C根本没有字符串变量,也没有处理字符串的特殊运算符。
所以使用 char类型的数组保存字符串。
char saying[20];
char say[] = "This is a string.";
没有明确定义数组大小,根据元素计算, 这个例子中是18, 17个字符+终止字符\0

初始化char数组,声明为常量,则后面程序不能修改它,否则会报错
const char message[] = "hello message.";

2. 字符串操作

2.1 确定字符串长度

    char str1[] = "To be or not to be.";
    int count = 0;
    while(str1[count] != '\0'){
        count++;
    }   
    printf("the length of str1 is %d characters.\n", count);
字符串数组
使用char二维数组存储字符串。
char saying[2][40] = {
    "To be or not to be,",
    "that is the question"
};
第一维 2 可以省略, 编译器可以推断出数组的行。
字符串数组的最后一维的大小必须指定。

操作字符串可以使用库函数。
#include <string.h>

2.2 复制字符串:

strcpy(string1, string2);
将string2复制到string1中。复制包括'\0';
strcpy不检查数组大小,所以使用期要先检测string1空间足够容纳string2
if(sizeof(string2) <= sizeof(string1)){
    strcpy(string1, string2);
}
strncpy() 可以将前n个字符复制到另一个字符串中
strncpy(dest, source, n);
第三个参数是 size_t 类型整数。

2.3 字符串长度

count = strlen(str2);
返回的长度不包括'\0'; 返回的size_t类型的无符号整数。
类型 size_t 在标准库 <stddef.h> 中定义。

2.4 连接字符串

strcat(str1, str2)
将str2加到str1末尾,还返回了str1
strncat(str1, str2, n);  指定要复制的字符串长度。

2.5 比较字符串

strcmp(str1, str2);
按照字母的排序比较字符串, 返回 > 或 < 或 == 0的 int值。
strncmp(str1, str2, n); 比较前n个字符。

2.6 搜索字符串中的一个字符

strchr(str1, c);
返回找到的地址。类型为 char*,  char的指针。
没找到则返回 NULL
#include <stdio.h>
#include <string.h>
int main(void){
    char str1[] = "The quick brown fox";
    char c = 'q';
    char *pGotChar = NULL;
    pGotChar = strchr(str1, c); 
    
    if(pGotChar != NULL){
        printf("Character has found %c, address is %p", *pGotChar, pGotChar);
    }   
    
    return 0;
}
//运行结果
$ ./a.out 
Character has found q, address is 0x7fff5ce62bf4
*为取消引用运算符, pGotchar为找到的地址, *pGotChar为地址对应的值。
strrchr() 从字符串末尾开始查找字符串。

2.7 字符串中查找子串

strstr(text, word)
查找一个字符串中的子字符串, 
返回找到第一个子字符串的位置指针, 找不到返回NULL

2.8 分析字符串

检查字符串的内容,可以使用头文件 <ctype.h> 中下面函数
S.N. 函数及说明
1 int isalnum(int c)
该函数检查传递的字符是否是字母数字。
2 int isalpha(int c)
该函数是否传递的字符是字母。
3 int iscntrl(int c)
该函数是否传递的字符是控制字符。
4 int isdigit(int c)
该函数是否传递的字符是十进制数字。
5 int isgraph(int c)
该函数是否传递的字符的图形表示,使用的语言环境。
6 int islower(int c)
该函数检查传递的字符是否是小写字母。
7 int isprint(int c)
该函数检查传递的字符是否是可打印的。
8 int ispunct(int c)
该函数检查传递的字符是否是标点符号。
9 int isspace(int c)
该函数检查传递的字符是否是空白。
10 int isupper(int c)
该函数检查传递的字符是否是大写字母。
11 int isxdigit(int c)
该函数检查传递的字符是否是十六进制数字。

2.9 字符串输入

gets(buffer)
这个函数将输入的字符串读入数组buffer中。
从键盘读入所有字符, 直到按下回车键为止。在字符串末尾自动加上'\0';
gets函数的缺点是, 没有检测buffer是否有足够的空间存储。
可以使用fgets()函数, 
fgets允许指定输入字符串的最大长度,可用于任意种类的输入字符串,
而gets只能读取标准输入流stdin
if(fgets(buffer, sizeof(buffer), stdin) == NULL){
    printf("Error input");
    return 1;
}
在按下回车时, fgets比gets多输入一个'\n'字符。

在<ctype.h>中,包含两个转换函数
toupper(char c) : 转换为大写
tolower(char c); 转换为小写


2.10 将字符串转换为数值。

在头文件<stdlib.h>, 声明了一些将字符串转换为数值的函数
atof()  : 转换为double类型
atoi() :  转换为int类型
atol() : 转换为long类型数值
atoll() : 转换为long long类型数值。
char value_str[] = "98.4";
double value = 0;
value = atof(value_str);

3. 使用宽字符串

宽字符串存储在 wchar_t 类型的数组中。在<wchar.h>头中定义。
#include <stdio.h>
#include <wchar.h>
int main(void){
    wchar_t w_string[] = L"hello.";
    printf("the wide string is : %S\n, size is : %lu\n", w_string, sizeof(w_string));

    return 0;

}

//结果
$ ./a.out 
the wide string is : hello.
, size is : 28
宽字符输出printf,使用%S, 总共6个字符, 每个字符占用4个字节。共28字节。

宽字符串操作函数在<wchar.h>中声明, 基本与字符串操作相似
wcslen : 返回宽字符串长度
wcscpy() : 复制
wcsncpy() : 指定长度复制
wcscat() :  连接
wcscmp() : 指定长度比较
wcsncmp() :  指定长度比较
wcschr() : 查找字符
wcsstr(): 查找子串。

fgetsws() : 读取宽字符串。

<wchar.h>中还声明了测试宽字符子集的函数。
iswlower()
iswupper() 
。。。 比前面的多了w。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值