C--字符串简单理解使用之一

    跟程序打交道,字符串处理是并不可少的,有时候我们用数组,用指针,又是用到“string.h”,简单的过滤下,并加深下自己的理解。

如何存储字符串字面量

1、字符串字面量(字符串常量,在C标准中称为,字符串字面量)

  从本质上而言,C语言把字符串字面量作为字符数组来处理。当C语言编译器在程序中遇到长度为n的字符串字面量时,它会为字符串字面量分配长度为n+1的内存空间,在末尾增加一个额外的字符——空字符(\0)。

字符串字面量的操作
  通常情况下可以在任何C语言允许使用 char * 指针的地方使用字符串字面量。如:
char *p;
p = “abc”;
这个赋值操作不是复制 “abc” 中的字符,而仅仅是使 p 指向字符串的第一个字符。

2、字符串变量

  一些编程语言为声明字符串提供了特殊的 string 类型。C语言采取了不同的方式:只要保证字符串是以空字符串结尾的,任何一维的字符数组都可以用来存储字符串。如果编写自己的字符串处理函数,请千万注意要正确地处理空字符。
  假设需要变量用来存储最多80个字符的字符串。既然字符串会在末尾处需要空字符,那么要声明的变量是含有81个字符的数组。

#define STR_LEN 80


char str[STR_LEN + 1];
//对宏加一的这种方法是C程序员常用的方式。

初始化字符串变量

char date1[8] = "June 14";
date1: | J | u |  n | e |   | 1 | 4 | \0 |
char date2[9] = "June 14";
date2: | J | u |  n | e |   | 1 | 4 | \0 | \0 |

大体上来说,这种行为与C语言处理数组初始化的方法一致。
字符串变量的声明可以忽略它的长度。这种情况下,编译器会自动计算长度:

char date3[] = "June 14";

编译器为date3分配8个字符的空间。

字符数组与字符指针

一起来比较一下下面两个声明:
char date[] = “June 14”;
它声明date是个字符数组。和这个声明相似的是下面这个声明:
char *date = “June 14”;
它声明date是个指向字符串字面量的指针。
[注意],不能错误地认为上面两种date可以互换。两者之间有着显著的差异:
(1) 在声明为数组时,就像任意数组元素一样,可以修改存储在date中的字符。在声明为指针时,date指向字符串字面量。
(2) 在声明为数组时,date是数组名。在声明为指针时,date是变量,这个变量可以在程序执行期间指向其他字符串。
  如果需要可以修改的字符串,那么就要建立字符数组来存储字符串。这时声明指针变量是不够的。下面的声明使编译器为指针变量分配了足够的内存空间:
char *p;
可惜的是,它不为字符串分配空间。在使用p作为字符串之前,必须把p指向字符串数组。一种可能是把p指向已经存在的字符串变量:
char str[STR_LEN + 1], *p;
p = str;
现在p指向了str的第一个字符,所以可以把p作为字符串使用了

字符串处理函数


include <ctype.h>
-----------------

int isalnum(int c) 测试C是否为字母或数字

int isalpha(int c) 测试C是否为字母

int iscsym(int c) 测试C是否为字母、下划线或数字

int iscsymf(int c) 测试C是否为字母、下划线

int isdigit(int c) 测试C是否为十进制数字

int isxdigit(int c) 测试C是否为十六进数字

int islower(int c) 测试C是否为小写字母

int isupper(int c) 测试C是否为大写字母

int ispunct(int c) 测试C是否为标点符号

int isspace(int c) 测试C是否为空白

int isgraph (int c)     测试C是否为可打印字符

int isascii(int c) 判断C是否为ASCII字符,(0-127int toasscii(int c) 将字符C转换成ASCII

int tolower(int c) 将字符C转换成小写字符

int toupper(int c) 将字符C转换成大写字符

include <stdlib.h>
------------------

double atof(const char *nptr) 将字符串转换成双精度浮点型数

int atoi(const char *nptr) 将字符串转换成整型数  

long atol(const char *nptr) 将字符串转换成长整型数

double strtod(const char *nptr, char **endptr) 将字符串转换成双精度浮点型数

loing int strtol(const char *nptr, char **endptr,int base) 将字符串转换成长整型数

unsigned long int strtoul(const char *nptr, char **endptr, int base) 将字符串转换成无符号长整型数

char *gcvt(double number, sixe_t ndigits, char *buf)将浮点整型数转换为字符串,取四舍五入

include <string.h>
------------------

char *strcpy(char *s1, const char *s2) 将字符串s2复制到数组s1中

char *ctrncpy(char *s1, const char *s2, size_t n) 将字符串s2开始的n个字节复制到字符数组s1中

char *strcat(char *s1, const char *s2) 将字符串s2追加到字符数组s1中的字符串后

char *strncat(char *s1, const char *s2, size_t n) 将字符串s2开始的n个字节追加到字符数组s1中的字符串后

int strcmp(const char *s1, const char *s2) 比较字符串s1与字符串s2

int strncmp(const char *s1, const char *s2, size_t n) 比较字符串s1与字符串s2前n个字符

char *strchr(const char *s, int c) 查找C所表的字符在字符串s中首次出现的位置,成功返回该位置的指针,否则返回NULL

char *strrchr(const char *s, int c) 返回C 所代表的字符在s中最后一次出现的位置指针,否则返回NULL

size_t strcspn(const char *s1, const char *s2)计算并返回字符串s1中不包含字符串s2中任何字符的起始段的长充,即在字符串s1中查找是否有字符串s2的字符,若碰到有该字符则返回从开始到该字符之前的字符长度

size_t strspn(const char *s1, const char *s2)计算并返回字符串s1中只包含字符串s2中字符的起始段的长段,即当在s1中没遇到s2在s2中的字符时,返回从开始到该字符之前的字符串的长度

char *strpbrk(const char *s1,const char *s2)查找字符串s2中任意字符在字符串s1中首次出现的位置

char *strstr(const char *s1, const char *s2) 返回字符串s2在字符串s1中首次出次的位置指针,否则返回NULL

char *strtok(char *s1, const char *s2) 对strtok()函数的反复调用将使字符串s1分解为若干记号,这些记号用字符串s2中所包含的字符分开,第一次调用包含s1作为第一个参数,而继续划分相同字符串的后续调用将包含NULL作为第一个参数,每次调用将返回指向当前记号的指针。如果当调用函数时没有更多的记号,则返回NULL

字符串内存函数
-------

void *memcpy(void *s1, const void *s2, size_t n) 将s2指向的内存块内n个字符复制到s1指向的内存块,返回结果对象的指针;

void *memmove(void *s1,const void *s2, size_t n) 将s2指向的内存块内n个字符复制到内存中的临时空间,在从临时空间复制到s1指向的内存块内,返回结果对像的指针

void memcmp(const void *s1, const void *s2,size_t n) 用于比较s1和s2所指向的内存块中前n个字符的大小,返回比较结果

void *memchr(const void *s, int c, size_t n) 查找s所指向的内存块的前n个字符内第1次出现c的地方。如果找到了c,则返回s1中c的指针,否则返回null

void *memset(void *s, int c,size_t n) 将c复制到s指向的内存块的前n个字符中,返回产生的指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值