字符串

发布时间 2023-12-06 16:19:24作者: lttlmylove

·字符串

一、字符串的一些特点

1.从ANSI C标准起,如果字符串面量之间没有间隔,或者用空白字符分隔,C会将其视为串联起来的字符串面量。

char greeting[50] = "Hello,and""how are""you""today!";
//等价于
char greeting[50]="Hello,and how are you today!";

2.如果要在字符串内部使用双引号,必须在双引号前面加上一个反斜杠()

printf("\"Run ,Spot, run!\"exclaimed Dick.\n")
//输出如下
"Run , Spot, run!"exclaimed Dick.

3.字符串属于静态存储类别,这说明说如在函数中使用字符串常量,该字符串只会被储存一次,在整个程序的生命期内存在,即使函数被调用多次。用双引号括起来的内容被视为指向该字符串储存位置的指针。这类似于把数组名作为指向该数组位置的指针。

//把字符串看成指针
#include<stdio.h>
int main(void)
{
    printf("%s,%p,%c\n","We""are"*"space farers");
    
    return 0;
}
//输出
//We, 0x100000f61, s  其中0x100000f61是a的地址

注:字符数组名和其他数组名一样,是该数组首元素的地址。

char car[0] = "Tata";
//那么
car == &[0]
*car == 'T'
*(car+1) == car[1] == 'a'    

二、字符串数组和初始化

定义字符串数组时,必须让编译器知道需要多少空间。

1.用足够空间的数组储存字符串

const char m1[40] = "Limit yourself to one line's worth.";
//const表明不会更改这个字符串
//下面是标准的数组初始化形式
const char m1[40] = {""L","i","m",""""""""""",".","\0"";}
//注意最后的空字符串,没有这个空字符,这就不是一个字符串,而是一个字符数组。

注:在指定数组大小时,要确保数组的元素个数至少要比字符串是长度多一(为了容纳空字符)

所有未被使用的元素被自动初始化为0(这里的0指的是char形式的空字符,不是数字字符0)

2.让编译器确定数组的大小

const char m2[] = "If you can't think of anything, fake it.";

注:让编译器计算数组的大小只能用在初始化数组时,如果创建一个稍后再填充的数组,就必须在声明时指定大小。

声明数组时,数组大小必须是可求值的整数。在C99新增变长数组之前,数组的大小必须是整型常量,包括由整数常量组成的表达式。

int n = 8;
char cookies[1];	//有效
char cakes[2 + 5];  //有效,数组大小是整型常量表达式
char pies[2*sizeof(long double) + 1];//有效
char crumbs[n];		//C99标准之前无效,C99之后这种数组是变长数组

补:还可以用指针表示法创建字符串

const char * pt1 = "Something is pointing at me"
//该声明与下面的声明几乎相同(不是完全相同)
const char ar1[] = "Something is pointing at me.";