Error[8]: Undefined offset: 29, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

目录

前言

一.字符串字面量

二.字符串的存储

                补充:

三.字符指针

四.字符串的访问和输入/输出

                1.如何访问字符串中的单个字符

                2.字符串的输入/输出


前言

本章内容介绍向函数传递字符串以及字符串输入/输出、复制、连接等常用的字符串处理 *** 作,主要内容有:字符串字面量,字符数组和字符指针,字符串的输入/输出、复制、连接、比较等常用的字符串处理函数,向函数传递字符串,从函数返回一个字符串指针


一.字符串字面量

字符串字面量有时也称字符串常量,它是由一对双引号括起来的一个字符序列,如"Hello","123"都是字符串。无论双引号内是否包含字符,包含多少个字符,都代表一个字符串字面量。注意:字符串字面量不同于字符串常量。例如:"a"是字符串字面量,而'a'是字符常量。 

为便于确定字符串长度,C编译器会自动在字符串的末尾添加一个ASCII码值为0的空 *** 作符'\0',作为字符串结束的标志,在字符串中可以不显示地写出。因此,字符串实际就是由若干有效字符构成且以字符'\0'作为结束的一个字符序列。

二.字符串的存储

C语言没有提供字符串数据类型,因此字符串的存取要用字符型数组来实现。一个字符串可以存在于字符数组中,但一个字符型数组中存储的并非一定是一个字符串,这要看它的最后一个元素是否为'\0',字符数组是由字符构成的数组,仅当其最后一个元素是'\0'时才能表示字符串。字符串结束标志'char str[6] = { 'H','e','l','l','o' ,'char str[] = { 'H','e','l','l','o','char str[] = { 'H','e','l','l','o' };'};'};'也占一个字节的内存,但它不计入字符串的实际长度,只计入数组的长度。

 对于字符数组,可以采用和其他数组一样的方式进行初始化。例如:

char str[] = { "Hello" };
char str[] = "Hello";

上面代码定义了一个有6个元素的字符数组str,其前5个元素分别初始化为 'H','e','l','l','o',最后一个元素初始化为'\0'。

注意:如果没有'\0',那么数组str就不代表一个字符串。因为'\0'在内存中也占一个字节的存储单元,所以数组定义的长度应大于等于字符串包括'\0'在内的字符个数。字符数组str初始化后,存储结构如图:

如果省略对数组长度的声明,例如:

由于字符串字面量"Hello"的末尾字符是'例如,本例字符串的实际长度为5,而字符数组的大小为6.',因此数组的大小为字符串中实际字符的个数加1

 那么系统就会自动按照初始化列表中提供的初值个数确定数组的大小。而

补充:

系统将str初始化为一个长度为5的数组,因为存储字符串"Hello"至少需要6个字节的存储单元,长度声明为5时,将会因为没有多余空间存放编译系统在数组末尾自动添加的'\0',而使系统无法将str当作字符串处理,所以,当省略对数组长度的声明时,必须人为地在数组的初始化列表中添加'\0',才能将其作为字符串来使用。

还可以用下列俩种初始化字符数组:

char weekday[7][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
char weekday[][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

 按这种方式定义和初始化数组,不必指定数组的大小,也不必单独为数组中的每个元素进行初始化,编译系统会根据字符串中字符的个数确定数组的大小,char weekday[][] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

char* ptr = "Hello";

char* ptr; ptr = "Hello";

通常,将一个字符串存放在一维字符数组中,将多个字符串存放在二维字符数组中。当用二维字符数组存放多个字符串时,数组第一维的长度代表要存储的字符串的个数,可以省略,但第二维的长度不能省略,应按最长的字符串长度设定数组第二维的长度。例如:

注意,这里不能理解为将字符串赋值给ptr。

但是,不能写成这样:

*ptr = 'W';    /*不能修改ptr指向的常量存储区中的字符,因为它是只读的*/

因为二维数组是按行存储的,系统必须知道每一行的长度才能为数组分配存储单元。

三.字符指针

字符指针是指向字符型数据的指针变量,每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。因此,只要将字符串的首地址赋值给字符指针,即可让字符指针指向一个字符串。对于字符串字面量而言,字符串字面量本身代表的就是存放它的常量存储区的首地址,是一个地址常量。

例如:

char str[10] = "Hello";
char* ptr = str;

 与

*ptr = 'W';	//等价于ptr[0]='W';相当于str[0]='W'

是等价的,都表示定义一个字符指针变量ptr,并用字符串字面量"Hello"在常量存储区中的首地址为其初始化,即让ptr指向字符串字面量"Hello"。总之,正确使用字符指针,必须明确字符串被保存到了哪里以及字符指针指向了哪里。

因字符串"Hello"保存在只读的常量存储区中,所以此时可修改指针变量ptr的值(即ptr的指向),但不能对ptr所指向的存储单元进行写 *** 作。例如,下面 *** 作就是非法的:

四.字符串的访问和输入/输出

但可以这样 *** 作:

1.如何访问字符串中的单个字符

那么此时由于数组名代表数组的首地址,因此将str赋值给ptr,就是让ptr指向数组的str中存储的字符串"Hello"。

因数组名是一个地址常量,所以str的值是不可以修改的,但ptr的值(即ptr的指向)可以被修改,ptr所指向的字符串也可以被修改。例如,若要将ptr所指向的字符串中的第一个字符修改为'W',可以用下面语句:

(1)按c格式符,一个字符一个字符地单独输入/输出。例如:

for (i = 0; i < 10; i++) { scanf("%c", &str[i]); //输入字符数组 } for (i = 0; i < 10; i++) { printf("%c", str[i]); //输出字符数组 }

for (i = 0; str[i] != '(2).按s格式符,将字符串作为一个整体输入/输出。例如:'; i++) { printf("%c", str[i]); //输出字符串 } scanf("%s", str[i]);

和其他类型的数组一样,可以使用下标方式来访问存放于字符数组中的每个字符。例如,在前面定义的字符数组str中,str[0]就表示访问第一个字符'H',str[1]表示第二个字符'e',依次类推,可以通过下标为i的元素str[i]来访问存放于数组中的第i+1个字符。

另外,还可通过字符指针间接访问存放于数组中的字符串,例如,若字符指针ptr指向了字符数组str的首地址,则既可以通过*(ptr+i)来引用字符串中的第i+1个字符,*(ptr+i)指向相当于*(str+i),即str[i],也可以通过ptr++ *** 作,即移动指针ptr,使ptr指向值复串中的某个字符。

注意,对于数组名str,不能使用str++ *** 作使其指向字符串中的某个字符,因为数组名是一个地址常量,其值是不能改变的。 

2.字符串的输入/输出

printf("%s", str);

(3)使用字符串处理函数gets()可输入带空格的字符串

由于字符串的长度与字符数组的大小通常并不是完全一致的,因此很少使用上面这种方式输出字符数组中的字符串。更常用的方式是借助字符串结束标志'\0',识别字符串的结束,进而结束字符串的输出 *** 作,即:

puts()用于从括号内的参数给出的地址开始,依次输出存储单元中的字符,当遇到第一个'函数puts()输出字符串简洁方便,唯一不足的是不能像函数printf()那样输出行中的其他信息。'时输出结束,并且自动输出一个换行符。 

[+++]

[+++]

表示读入一个字符串,直到遇到空白字符(空格,回车符或制表符)为止,而

[+++]

表示输出一个字符串,直到遇到字符串结束标志。这里,由于字符数组名str本身代表该数组中存放的字符串的首地址,所以数组名str的前面不能加取地址运算符。

[+++],因为空格和制表符都是字符串的一部分

此外,函数gets()和scanf()对回车符的处理也不同。gets()以回车符作为字符串的终止符,同时将回车从输入缓冲区读走,但不作为字符串的一部分,而scanf()不读入回车符,回车符仍留在输入缓冲区中。

例如: 

#include
#define N 12
int main(void)
{
	char name[N];
	printf("Enter your name:");
	gets(name);
	printf("Hello %s!\n", name);
	return 0;
}

运行结果如下:

也可以用puts()输出字符串,[+++][+++]

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 30, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

目录

前言

一.字符串字面量

二.字符串的存储

                补充:

三.字符指针

四.字符串的访问和输入/输出

                1.如何访问字符串中的单个字符

                2.字符串的输入/输出


前言

本章内容介绍向函数传递字符串以及字符串输入/输出、复制、连接等常用的字符串处理 *** 作,主要内容有:字符串字面量,字符数组和字符指针,字符串的输入/输出、复制、连接、比较等常用的字符串处理函数,向函数传递字符串,从函数返回一个字符串指针


一.字符串字面量

字符串字面量有时也称字符串常量,它是由一对双引号括起来的一个字符序列,如"Hello","123"都是字符串。无论双引号内是否包含字符,包含多少个字符,都代表一个字符串字面量。注意:字符串字面量不同于字符串常量。例如:"a"是字符串字面量,而'a'是字符常量。 

为便于确定字符串长度,C编译器会自动在字符串的末尾添加一个ASCII码值为0的空 *** 作符'\0',作为字符串结束的标志,在字符串中可以不显示地写出。因此,字符串实际就是由若干有效字符构成且以字符'\0'作为结束的一个字符序列。

二.字符串的存储

C语言没有提供字符串数据类型,因此字符串的存取要用字符型数组来实现。一个字符串可以存在于字符数组中,但一个字符型数组中存储的并非一定是一个字符串,这要看它的最后一个元素是否为'\0',字符数组是由字符构成的数组,仅当其最后一个元素是'\0'时才能表示字符串。字符串结束标志'char str[6] = { 'H','e','l','l','o' ,'char str[] = { 'H','e','l','l','o','char str[] = { 'H','e','l','l','o' };'};'};'也占一个字节的内存,但它不计入字符串的实际长度,只计入数组的长度。

 对于字符数组,可以采用和其他数组一样的方式进行初始化。例如:

char str[] = { "Hello" };
char str[] = "Hello";

上面代码定义了一个有6个元素的字符数组str,其前5个元素分别初始化为 'H','e','l','l','o',最后一个元素初始化为'\0'。

注意:如果没有'\0',那么数组str就不代表一个字符串。因为'\0'在内存中也占一个字节的存储单元,所以数组定义的长度应大于等于字符串包括'\0'在内的字符个数。字符数组str初始化后,存储结构如图:

如果省略对数组长度的声明,例如:

由于字符串字面量"Hello"的末尾字符是'例如,本例字符串的实际长度为5,而字符数组的大小为6.',因此数组的大小为字符串中实际字符的个数加1

 那么系统就会自动按照初始化列表中提供的初值个数确定数组的大小。而

补充:

系统将str初始化为一个长度为5的数组,因为存储字符串"Hello"至少需要6个字节的存储单元,长度声明为5时,将会因为没有多余空间存放编译系统在数组末尾自动添加的'\0',而使系统无法将str当作字符串处理,所以,当省略对数组长度的声明时,必须人为地在数组的初始化列表中添加'\0',才能将其作为字符串来使用。

还可以用下列俩种初始化字符数组:

char weekday[7][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
char weekday[][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

 按这种方式定义和初始化数组,不必指定数组的大小,也不必单独为数组中的每个元素进行初始化,编译系统会根据字符串中字符的个数确定数组的大小,char weekday[][] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

char* ptr = "Hello";

char* ptr; ptr = "Hello";

通常,将一个字符串存放在一维字符数组中,将多个字符串存放在二维字符数组中。当用二维字符数组存放多个字符串时,数组第一维的长度代表要存储的字符串的个数,可以省略,但第二维的长度不能省略,应按最长的字符串长度设定数组第二维的长度。例如:

注意,这里不能理解为将字符串赋值给ptr。

但是,不能写成这样:

*ptr = 'W';    /*不能修改ptr指向的常量存储区中的字符,因为它是只读的*/

因为二维数组是按行存储的,系统必须知道每一行的长度才能为数组分配存储单元。

三.字符指针

字符指针是指向字符型数据的指针变量,每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。因此,只要将字符串的首地址赋值给字符指针,即可让字符指针指向一个字符串。对于字符串字面量而言,字符串字面量本身代表的就是存放它的常量存储区的首地址,是一个地址常量。

例如:

char str[10] = "Hello";
char* ptr = str;

 与

*ptr = 'W';	//等价于ptr[0]='W';相当于str[0]='W'

是等价的,都表示定义一个字符指针变量ptr,并用字符串字面量"Hello"在常量存储区中的首地址为其初始化,即让ptr指向字符串字面量"Hello"。总之,正确使用字符指针,必须明确字符串被保存到了哪里以及字符指针指向了哪里。

因字符串"Hello"保存在只读的常量存储区中,所以此时可修改指针变量ptr的值(即ptr的指向),但不能对ptr所指向的存储单元进行写 *** 作。例如,下面 *** 作就是非法的:

四.字符串的访问和输入/输出

但可以这样 *** 作:

1.如何访问字符串中的单个字符

那么此时由于数组名代表数组的首地址,因此将str赋值给ptr,就是让ptr指向数组的str中存储的字符串"Hello"。

因数组名是一个地址常量,所以str的值是不可以修改的,但ptr的值(即ptr的指向)可以被修改,ptr所指向的字符串也可以被修改。例如,若要将ptr所指向的字符串中的第一个字符修改为'W',可以用下面语句:

(1)按c格式符,一个字符一个字符地单独输入/输出。例如:

for (i = 0; i < 10; i++) { scanf("%c", &str[i]); //输入字符数组 } for (i = 0; i < 10; i++) { printf("%c", str[i]); //输出字符数组 }

for (i = 0; str[i] != '(2).按s格式符,将字符串作为一个整体输入/输出。例如:'; i++) { printf("%c", str[i]); //输出字符串 } scanf("%s", str[i]);

和其他类型的数组一样,可以使用下标方式来访问存放于字符数组中的每个字符。例如,在前面定义的字符数组str中,str[0]就表示访问第一个字符'H',str[1]表示第二个字符'e',依次类推,可以通过下标为i的元素str[i]来访问存放于数组中的第i+1个字符。

另外,还可通过字符指针间接访问存放于数组中的字符串,例如,若字符指针ptr指向了字符数组str的首地址,则既可以通过*(ptr+i)来引用字符串中的第i+1个字符,*(ptr+i)指向相当于*(str+i),即str[i],也可以通过ptr++ *** 作,即移动指针ptr,使ptr指向值复串中的某个字符。

注意,对于数组名str,不能使用str++ *** 作使其指向字符串中的某个字符,因为数组名是一个地址常量,其值是不能改变的。 

2.字符串的输入/输出

printf("%s", str);

(3)使用字符串处理函数gets()可输入带空格的字符串

由于字符串的长度与字符数组的大小通常并不是完全一致的,因此很少使用上面这种方式输出字符数组中的字符串。更常用的方式是借助字符串结束标志'\0',识别字符串的结束,进而结束字符串的输出 *** 作,即:

puts()用于从括号内的参数给出的地址开始,依次输出存储单元中的字符,当遇到第一个'函数puts()输出字符串简洁方便,唯一不足的是不能像函数printf()那样输出行中的其他信息。'时输出结束,并且自动输出一个换行符。 

[+++]

表示读入一个字符串,直到遇到空白字符(空格,回车符或制表符)为止,而

[+++]

表示输出一个字符串,直到遇到字符串结束标志。这里,由于字符数组名str本身代表该数组中存放的字符串的首地址,所以数组名str的前面不能加取地址运算符。

[+++],因为空格和制表符都是字符串的一部分

此外,函数gets()和scanf()对回车符的处理也不同。gets()以回车符作为字符串的终止符,同时将回车从输入缓冲区读走,但不作为字符串的一部分,而scanf()不读入回车符,回车符仍留在输入缓冲区中。

例如: 

#include
#define N 12
int main(void)
{
	char name[N];
	printf("Enter your name:");
	gets(name);
	printf("Hello %s!\n", name);
	return 0;
}

运行结果如下:

也可以用puts()输出字符串,[+++][+++]

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 31, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

目录

前言

一.字符串字面量

二.字符串的存储

                补充:

三.字符指针

四.字符串的访问和输入/输出

                1.如何访问字符串中的单个字符

                2.字符串的输入/输出


前言

本章内容介绍向函数传递字符串以及字符串输入/输出、复制、连接等常用的字符串处理 *** 作,主要内容有:字符串字面量,字符数组和字符指针,字符串的输入/输出、复制、连接、比较等常用的字符串处理函数,向函数传递字符串,从函数返回一个字符串指针


一.字符串字面量

字符串字面量有时也称字符串常量,它是由一对双引号括起来的一个字符序列,如"Hello","123"都是字符串。无论双引号内是否包含字符,包含多少个字符,都代表一个字符串字面量。注意:字符串字面量不同于字符串常量。例如:"a"是字符串字面量,而'a'是字符常量。 

为便于确定字符串长度,C编译器会自动在字符串的末尾添加一个ASCII码值为0的空 *** 作符'\0',作为字符串结束的标志,在字符串中可以不显示地写出。因此,字符串实际就是由若干有效字符构成且以字符'\0'作为结束的一个字符序列。

二.字符串的存储

C语言没有提供字符串数据类型,因此字符串的存取要用字符型数组来实现。一个字符串可以存在于字符数组中,但一个字符型数组中存储的并非一定是一个字符串,这要看它的最后一个元素是否为'\0',字符数组是由字符构成的数组,仅当其最后一个元素是'\0'时才能表示字符串。字符串结束标志'char str[6] = { 'H','e','l','l','o' ,'char str[] = { 'H','e','l','l','o','char str[] = { 'H','e','l','l','o' };'};'};'也占一个字节的内存,但它不计入字符串的实际长度,只计入数组的长度。

 对于字符数组,可以采用和其他数组一样的方式进行初始化。例如:

char str[] = { "Hello" };
char str[] = "Hello";

上面代码定义了一个有6个元素的字符数组str,其前5个元素分别初始化为 'H','e','l','l','o',最后一个元素初始化为'\0'。

注意:如果没有'\0',那么数组str就不代表一个字符串。因为'\0'在内存中也占一个字节的存储单元,所以数组定义的长度应大于等于字符串包括'\0'在内的字符个数。字符数组str初始化后,存储结构如图:

如果省略对数组长度的声明,例如:

由于字符串字面量"Hello"的末尾字符是'例如,本例字符串的实际长度为5,而字符数组的大小为6.',因此数组的大小为字符串中实际字符的个数加1

 那么系统就会自动按照初始化列表中提供的初值个数确定数组的大小。而

补充:

系统将str初始化为一个长度为5的数组,因为存储字符串"Hello"至少需要6个字节的存储单元,长度声明为5时,将会因为没有多余空间存放编译系统在数组末尾自动添加的'\0',而使系统无法将str当作字符串处理,所以,当省略对数组长度的声明时,必须人为地在数组的初始化列表中添加'\0',才能将其作为字符串来使用。

还可以用下列俩种初始化字符数组:

char weekday[7][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
char weekday[][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

 按这种方式定义和初始化数组,不必指定数组的大小,也不必单独为数组中的每个元素进行初始化,编译系统会根据字符串中字符的个数确定数组的大小,char weekday[][] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

char* ptr = "Hello";

char* ptr; ptr = "Hello";

通常,将一个字符串存放在一维字符数组中,将多个字符串存放在二维字符数组中。当用二维字符数组存放多个字符串时,数组第一维的长度代表要存储的字符串的个数,可以省略,但第二维的长度不能省略,应按最长的字符串长度设定数组第二维的长度。例如:

注意,这里不能理解为将字符串赋值给ptr。

但是,不能写成这样:

*ptr = 'W';    /*不能修改ptr指向的常量存储区中的字符,因为它是只读的*/

因为二维数组是按行存储的,系统必须知道每一行的长度才能为数组分配存储单元。

三.字符指针

字符指针是指向字符型数据的指针变量,每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。因此,只要将字符串的首地址赋值给字符指针,即可让字符指针指向一个字符串。对于字符串字面量而言,字符串字面量本身代表的就是存放它的常量存储区的首地址,是一个地址常量。

例如:

char str[10] = "Hello";
char* ptr = str;

 与

*ptr = 'W';	//等价于ptr[0]='W';相当于str[0]='W'

是等价的,都表示定义一个字符指针变量ptr,并用字符串字面量"Hello"在常量存储区中的首地址为其初始化,即让ptr指向字符串字面量"Hello"。总之,正确使用字符指针,必须明确字符串被保存到了哪里以及字符指针指向了哪里。

因字符串"Hello"保存在只读的常量存储区中,所以此时可修改指针变量ptr的值(即ptr的指向),但不能对ptr所指向的存储单元进行写 *** 作。例如,下面 *** 作就是非法的:

四.字符串的访问和输入/输出

但可以这样 *** 作:

1.如何访问字符串中的单个字符

那么此时由于数组名代表数组的首地址,因此将str赋值给ptr,就是让ptr指向数组的str中存储的字符串"Hello"。

因数组名是一个地址常量,所以str的值是不可以修改的,但ptr的值(即ptr的指向)可以被修改,ptr所指向的字符串也可以被修改。例如,若要将ptr所指向的字符串中的第一个字符修改为'W',可以用下面语句:

(1)按c格式符,一个字符一个字符地单独输入/输出。例如:

for (i = 0; i < 10; i++) { scanf("%c", &str[i]); //输入字符数组 } for (i = 0; i < 10; i++) { printf("%c", str[i]); //输出字符数组 }

for (i = 0; str[i] != '(2).按s格式符,将字符串作为一个整体输入/输出。例如:'; i++) { printf("%c", str[i]); //输出字符串 } scanf("%s", str[i]);

和其他类型的数组一样,可以使用下标方式来访问存放于字符数组中的每个字符。例如,在前面定义的字符数组str中,str[0]就表示访问第一个字符'H',str[1]表示第二个字符'e',依次类推,可以通过下标为i的元素str[i]来访问存放于数组中的第i+1个字符。

另外,还可通过字符指针间接访问存放于数组中的字符串,例如,若字符指针ptr指向了字符数组str的首地址,则既可以通过*(ptr+i)来引用字符串中的第i+1个字符,*(ptr+i)指向相当于*(str+i),即str[i],也可以通过ptr++ *** 作,即移动指针ptr,使ptr指向值复串中的某个字符。

注意,对于数组名str,不能使用str++ *** 作使其指向字符串中的某个字符,因为数组名是一个地址常量,其值是不能改变的。 

2.字符串的输入/输出

printf("%s", str);

(3)使用字符串处理函数gets()可输入带空格的字符串

由于字符串的长度与字符数组的大小通常并不是完全一致的,因此很少使用上面这种方式输出字符数组中的字符串。更常用的方式是借助字符串结束标志'\0',识别字符串的结束,进而结束字符串的输出 *** 作,即:

puts()用于从括号内的参数给出的地址开始,依次输出存储单元中的字符,当遇到第一个'函数puts()输出字符串简洁方便,唯一不足的是不能像函数printf()那样输出行中的其他信息。'时输出结束,并且自动输出一个换行符。 

 

表示读入一个字符串,直到遇到空白字符(空格,回车符或制表符)为止,而

[+++]

表示输出一个字符串,直到遇到字符串结束标志。这里,由于字符数组名str本身代表该数组中存放的字符串的首地址,所以数组名str的前面不能加取地址运算符。

[+++],因为空格和制表符都是字符串的一部分

此外,函数gets()和scanf()对回车符的处理也不同。gets()以回车符作为字符串的终止符,同时将回车从输入缓冲区读走,但不作为字符串的一部分,而scanf()不读入回车符,回车符仍留在输入缓冲区中。

例如: 

#include
#define N 12
int main(void)
{
	char name[N];
	printf("Enter your name:");
	gets(name);
	printf("Hello %s!\n", name);
	return 0;
}

运行结果如下:

也可以用puts()输出字符串,[+++][+++]

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 32, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

目录

前言

一.字符串字面量

二.字符串的存储

                补充:

三.字符指针

四.字符串的访问和输入/输出

                1.如何访问字符串中的单个字符

                2.字符串的输入/输出


前言

本章内容介绍向函数传递字符串以及字符串输入/输出、复制、连接等常用的字符串处理 *** 作,主要内容有:字符串字面量,字符数组和字符指针,字符串的输入/输出、复制、连接、比较等常用的字符串处理函数,向函数传递字符串,从函数返回一个字符串指针


一.字符串字面量

字符串字面量有时也称字符串常量,它是由一对双引号括起来的一个字符序列,如"Hello","123"都是字符串。无论双引号内是否包含字符,包含多少个字符,都代表一个字符串字面量。注意:字符串字面量不同于字符串常量。例如:"a"是字符串字面量,而'a'是字符常量。 

为便于确定字符串长度,C编译器会自动在字符串的末尾添加一个ASCII码值为0的空 *** 作符'\0',作为字符串结束的标志,在字符串中可以不显示地写出。因此,字符串实际就是由若干有效字符构成且以字符'\0'作为结束的一个字符序列。

二.字符串的存储

C语言没有提供字符串数据类型,因此字符串的存取要用字符型数组来实现。一个字符串可以存在于字符数组中,但一个字符型数组中存储的并非一定是一个字符串,这要看它的最后一个元素是否为'\0',字符数组是由字符构成的数组,仅当其最后一个元素是'\0'时才能表示字符串。字符串结束标志'char str[6] = { 'H','e','l','l','o' ,'char str[] = { 'H','e','l','l','o','char str[] = { 'H','e','l','l','o' };'};'};'也占一个字节的内存,但它不计入字符串的实际长度,只计入数组的长度。

 对于字符数组,可以采用和其他数组一样的方式进行初始化。例如:

char str[] = { "Hello" };
char str[] = "Hello";

上面代码定义了一个有6个元素的字符数组str,其前5个元素分别初始化为 'H','e','l','l','o',最后一个元素初始化为'\0'。

注意:如果没有'\0',那么数组str就不代表一个字符串。因为'\0'在内存中也占一个字节的存储单元,所以数组定义的长度应大于等于字符串包括'\0'在内的字符个数。字符数组str初始化后,存储结构如图:

如果省略对数组长度的声明,例如:

由于字符串字面量"Hello"的末尾字符是'例如,本例字符串的实际长度为5,而字符数组的大小为6.',因此数组的大小为字符串中实际字符的个数加1

 那么系统就会自动按照初始化列表中提供的初值个数确定数组的大小。而

补充:

系统将str初始化为一个长度为5的数组,因为存储字符串"Hello"至少需要6个字节的存储单元,长度声明为5时,将会因为没有多余空间存放编译系统在数组末尾自动添加的'\0',而使系统无法将str当作字符串处理,所以,当省略对数组长度的声明时,必须人为地在数组的初始化列表中添加'\0',才能将其作为字符串来使用。

还可以用下列俩种初始化字符数组:

char weekday[7][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
char weekday[][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

 按这种方式定义和初始化数组,不必指定数组的大小,也不必单独为数组中的每个元素进行初始化,编译系统会根据字符串中字符的个数确定数组的大小,char weekday[][] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

char* ptr = "Hello";

char* ptr; ptr = "Hello";

通常,将一个字符串存放在一维字符数组中,将多个字符串存放在二维字符数组中。当用二维字符数组存放多个字符串时,数组第一维的长度代表要存储的字符串的个数,可以省略,但第二维的长度不能省略,应按最长的字符串长度设定数组第二维的长度。例如:

注意,这里不能理解为将字符串赋值给ptr。

但是,不能写成这样:

*ptr = 'W';    /*不能修改ptr指向的常量存储区中的字符,因为它是只读的*/

因为二维数组是按行存储的,系统必须知道每一行的长度才能为数组分配存储单元。

三.字符指针

字符指针是指向字符型数据的指针变量,每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。因此,只要将字符串的首地址赋值给字符指针,即可让字符指针指向一个字符串。对于字符串字面量而言,字符串字面量本身代表的就是存放它的常量存储区的首地址,是一个地址常量。

例如:

char str[10] = "Hello";
char* ptr = str;

 与

*ptr = 'W';	//等价于ptr[0]='W';相当于str[0]='W'

是等价的,都表示定义一个字符指针变量ptr,并用字符串字面量"Hello"在常量存储区中的首地址为其初始化,即让ptr指向字符串字面量"Hello"。总之,正确使用字符指针,必须明确字符串被保存到了哪里以及字符指针指向了哪里。

因字符串"Hello"保存在只读的常量存储区中,所以此时可修改指针变量ptr的值(即ptr的指向),但不能对ptr所指向的存储单元进行写 *** 作。例如,下面 *** 作就是非法的:

四.字符串的访问和输入/输出

但可以这样 *** 作:

1.如何访问字符串中的单个字符

那么此时由于数组名代表数组的首地址,因此将str赋值给ptr,就是让ptr指向数组的str中存储的字符串"Hello"。

因数组名是一个地址常量,所以str的值是不可以修改的,但ptr的值(即ptr的指向)可以被修改,ptr所指向的字符串也可以被修改。例如,若要将ptr所指向的字符串中的第一个字符修改为'W',可以用下面语句:

(1)按c格式符,一个字符一个字符地单独输入/输出。例如:

for (i = 0; i < 10; i++) { scanf("%c", &str[i]); //输入字符数组 } for (i = 0; i < 10; i++) { printf("%c", str[i]); //输出字符数组 }

for (i = 0; str[i] != '(2).按s格式符,将字符串作为一个整体输入/输出。例如:'; i++) { printf("%c", str[i]); //输出字符串 } scanf("%s", str[i]);

和其他类型的数组一样,可以使用下标方式来访问存放于字符数组中的每个字符。例如,在前面定义的字符数组str中,str[0]就表示访问第一个字符'H',str[1]表示第二个字符'e',依次类推,可以通过下标为i的元素str[i]来访问存放于数组中的第i+1个字符。

另外,还可通过字符指针间接访问存放于数组中的字符串,例如,若字符指针ptr指向了字符数组str的首地址,则既可以通过*(ptr+i)来引用字符串中的第i+1个字符,*(ptr+i)指向相当于*(str+i),即str[i],也可以通过ptr++ *** 作,即移动指针ptr,使ptr指向值复串中的某个字符。

注意,对于数组名str,不能使用str++ *** 作使其指向字符串中的某个字符,因为数组名是一个地址常量,其值是不能改变的。 

2.字符串的输入/输出

printf("%s", str);

(3)使用字符串处理函数gets()可输入带空格的字符串

由于字符串的长度与字符数组的大小通常并不是完全一致的,因此很少使用上面这种方式输出字符数组中的字符串。更常用的方式是借助字符串结束标志'\0',识别字符串的结束,进而结束字符串的输出 *** 作,即:

puts()用于从括号内的参数给出的地址开始,依次输出存储单元中的字符,当遇到第一个'函数puts()输出字符串简洁方便,唯一不足的是不能像函数printf()那样输出行中的其他信息。'时输出结束,并且自动输出一个换行符。 

 

表示读入一个字符串,直到遇到空白字符(空格,回车符或制表符)为止,而

 

表示输出一个字符串,直到遇到字符串结束标志。这里,由于字符数组名str本身代表该数组中存放的字符串的首地址,所以数组名str的前面不能加取地址运算符。

[+++],因为空格和制表符都是字符串的一部分

此外,函数gets()和scanf()对回车符的处理也不同。gets()以回车符作为字符串的终止符,同时将回车从输入缓冲区读走,但不作为字符串的一部分,而scanf()不读入回车符,回车符仍留在输入缓冲区中。

例如: 

#include
#define N 12
int main(void)
{
	char name[N];
	printf("Enter your name:");
	gets(name);
	printf("Hello %s!\n", name);
	return 0;
}

运行结果如下:

也可以用puts()输出字符串,[+++][+++]

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 33, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

目录

前言

一.字符串字面量

二.字符串的存储

                补充:

三.字符指针

四.字符串的访问和输入/输出

                1.如何访问字符串中的单个字符

                2.字符串的输入/输出


前言

本章内容介绍向函数传递字符串以及字符串输入/输出、复制、连接等常用的字符串处理 *** 作,主要内容有:字符串字面量,字符数组和字符指针,字符串的输入/输出、复制、连接、比较等常用的字符串处理函数,向函数传递字符串,从函数返回一个字符串指针


一.字符串字面量

字符串字面量有时也称字符串常量,它是由一对双引号括起来的一个字符序列,如"Hello","123"都是字符串。无论双引号内是否包含字符,包含多少个字符,都代表一个字符串字面量。注意:字符串字面量不同于字符串常量。例如:"a"是字符串字面量,而'a'是字符常量。 

为便于确定字符串长度,C编译器会自动在字符串的末尾添加一个ASCII码值为0的空 *** 作符'\0',作为字符串结束的标志,在字符串中可以不显示地写出。因此,字符串实际就是由若干有效字符构成且以字符'\0'作为结束的一个字符序列。

二.字符串的存储

C语言没有提供字符串数据类型,因此字符串的存取要用字符型数组来实现。一个字符串可以存在于字符数组中,但一个字符型数组中存储的并非一定是一个字符串,这要看它的最后一个元素是否为'\0',字符数组是由字符构成的数组,仅当其最后一个元素是'\0'时才能表示字符串。字符串结束标志'char str[6] = { 'H','e','l','l','o' ,'char str[] = { 'H','e','l','l','o','char str[] = { 'H','e','l','l','o' };'};'};'也占一个字节的内存,但它不计入字符串的实际长度,只计入数组的长度。

 对于字符数组,可以采用和其他数组一样的方式进行初始化。例如:

char str[] = { "Hello" };
char str[] = "Hello";

上面代码定义了一个有6个元素的字符数组str,其前5个元素分别初始化为 'H','e','l','l','o',最后一个元素初始化为'\0'。

注意:如果没有'\0',那么数组str就不代表一个字符串。因为'\0'在内存中也占一个字节的存储单元,所以数组定义的长度应大于等于字符串包括'\0'在内的字符个数。字符数组str初始化后,存储结构如图:

如果省略对数组长度的声明,例如:

由于字符串字面量"Hello"的末尾字符是'例如,本例字符串的实际长度为5,而字符数组的大小为6.',因此数组的大小为字符串中实际字符的个数加1

 那么系统就会自动按照初始化列表中提供的初值个数确定数组的大小。而

补充:

系统将str初始化为一个长度为5的数组,因为存储字符串"Hello"至少需要6个字节的存储单元,长度声明为5时,将会因为没有多余空间存放编译系统在数组末尾自动添加的'\0',而使系统无法将str当作字符串处理,所以,当省略对数组长度的声明时,必须人为地在数组的初始化列表中添加'\0',才能将其作为字符串来使用。

还可以用下列俩种初始化字符数组:

char weekday[7][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
char weekday[][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

 按这种方式定义和初始化数组,不必指定数组的大小,也不必单独为数组中的每个元素进行初始化,编译系统会根据字符串中字符的个数确定数组的大小,char weekday[][] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

char* ptr = "Hello";

char* ptr; ptr = "Hello";

通常,将一个字符串存放在一维字符数组中,将多个字符串存放在二维字符数组中。当用二维字符数组存放多个字符串时,数组第一维的长度代表要存储的字符串的个数,可以省略,但第二维的长度不能省略,应按最长的字符串长度设定数组第二维的长度。例如:

注意,这里不能理解为将字符串赋值给ptr。

但是,不能写成这样:

*ptr = 'W';    /*不能修改ptr指向的常量存储区中的字符,因为它是只读的*/

因为二维数组是按行存储的,系统必须知道每一行的长度才能为数组分配存储单元。

三.字符指针

字符指针是指向字符型数据的指针变量,每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。因此,只要将字符串的首地址赋值给字符指针,即可让字符指针指向一个字符串。对于字符串字面量而言,字符串字面量本身代表的就是存放它的常量存储区的首地址,是一个地址常量。

例如:

char str[10] = "Hello";
char* ptr = str;

 与

*ptr = 'W';	//等价于ptr[0]='W';相当于str[0]='W'

是等价的,都表示定义一个字符指针变量ptr,并用字符串字面量"Hello"在常量存储区中的首地址为其初始化,即让ptr指向字符串字面量"Hello"。总之,正确使用字符指针,必须明确字符串被保存到了哪里以及字符指针指向了哪里。

因字符串"Hello"保存在只读的常量存储区中,所以此时可修改指针变量ptr的值(即ptr的指向),但不能对ptr所指向的存储单元进行写 *** 作。例如,下面 *** 作就是非法的:

四.字符串的访问和输入/输出

但可以这样 *** 作:

1.如何访问字符串中的单个字符

那么此时由于数组名代表数组的首地址,因此将str赋值给ptr,就是让ptr指向数组的str中存储的字符串"Hello"。

因数组名是一个地址常量,所以str的值是不可以修改的,但ptr的值(即ptr的指向)可以被修改,ptr所指向的字符串也可以被修改。例如,若要将ptr所指向的字符串中的第一个字符修改为'W',可以用下面语句:

(1)按c格式符,一个字符一个字符地单独输入/输出。例如:

for (i = 0; i < 10; i++) { scanf("%c", &str[i]); //输入字符数组 } for (i = 0; i < 10; i++) { printf("%c", str[i]); //输出字符数组 }

for (i = 0; str[i] != '(2).按s格式符,将字符串作为一个整体输入/输出。例如:'; i++) { printf("%c", str[i]); //输出字符串 } scanf("%s", str[i]);

和其他类型的数组一样,可以使用下标方式来访问存放于字符数组中的每个字符。例如,在前面定义的字符数组str中,str[0]就表示访问第一个字符'H',str[1]表示第二个字符'e',依次类推,可以通过下标为i的元素str[i]来访问存放于数组中的第i+1个字符。

另外,还可通过字符指针间接访问存放于数组中的字符串,例如,若字符指针ptr指向了字符数组str的首地址,则既可以通过*(ptr+i)来引用字符串中的第i+1个字符,*(ptr+i)指向相当于*(str+i),即str[i],也可以通过ptr++ *** 作,即移动指针ptr,使ptr指向值复串中的某个字符。

注意,对于数组名str,不能使用str++ *** 作使其指向字符串中的某个字符,因为数组名是一个地址常量,其值是不能改变的。 

2.字符串的输入/输出

printf("%s", str);

(3)使用字符串处理函数gets()可输入带空格的字符串

由于字符串的长度与字符数组的大小通常并不是完全一致的,因此很少使用上面这种方式输出字符数组中的字符串。更常用的方式是借助字符串结束标志'\0',识别字符串的结束,进而结束字符串的输出 *** 作,即:

puts()用于从括号内的参数给出的地址开始,依次输出存储单元中的字符,当遇到第一个'函数puts()输出字符串简洁方便,唯一不足的是不能像函数printf()那样输出行中的其他信息。'时输出结束,并且自动输出一个换行符。 

 

表示读入一个字符串,直到遇到空白字符(空格,回车符或制表符)为止,而

 

表示输出一个字符串,直到遇到字符串结束标志。这里,由于字符数组名str本身代表该数组中存放的字符串的首地址,所以数组名str的前面不能加取地址运算符。

,因为空格和制表符都是字符串的一部分

此外,函数gets()和scanf()对回车符的处理也不同。gets()以回车符作为字符串的终止符,同时将回车从输入缓冲区读走,但不作为字符串的一部分,而scanf()不读入回车符,回车符仍留在输入缓冲区中。

例如: 

#include
#define N 12
int main(void)
{
	char name[N];
	printf("Enter your name:");
	gets(name);
	printf("Hello %s!\n", name);
	return 0;
}

运行结果如下:

也可以用puts()输出字符串,[+++][+++]

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 34, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

目录

前言

一.字符串字面量

二.字符串的存储

                补充:

三.字符指针

四.字符串的访问和输入/输出

                1.如何访问字符串中的单个字符

                2.字符串的输入/输出


前言

本章内容介绍向函数传递字符串以及字符串输入/输出、复制、连接等常用的字符串处理 *** 作,主要内容有:字符串字面量,字符数组和字符指针,字符串的输入/输出、复制、连接、比较等常用的字符串处理函数,向函数传递字符串,从函数返回一个字符串指针


一.字符串字面量

字符串字面量有时也称字符串常量,它是由一对双引号括起来的一个字符序列,如"Hello","123"都是字符串。无论双引号内是否包含字符,包含多少个字符,都代表一个字符串字面量。注意:字符串字面量不同于字符串常量。例如:"a"是字符串字面量,而'a'是字符常量。 

为便于确定字符串长度,C编译器会自动在字符串的末尾添加一个ASCII码值为0的空 *** 作符'\0',作为字符串结束的标志,在字符串中可以不显示地写出。因此,字符串实际就是由若干有效字符构成且以字符'\0'作为结束的一个字符序列。

二.字符串的存储

C语言没有提供字符串数据类型,因此字符串的存取要用字符型数组来实现。一个字符串可以存在于字符数组中,但一个字符型数组中存储的并非一定是一个字符串,这要看它的最后一个元素是否为'\0',字符数组是由字符构成的数组,仅当其最后一个元素是'\0'时才能表示字符串。字符串结束标志'char str[6] = { 'H','e','l','l','o' ,'char str[] = { 'H','e','l','l','o','char str[] = { 'H','e','l','l','o' };'};'};'也占一个字节的内存,但它不计入字符串的实际长度,只计入数组的长度。

 对于字符数组,可以采用和其他数组一样的方式进行初始化。例如:

char str[] = { "Hello" };
char str[] = "Hello";

上面代码定义了一个有6个元素的字符数组str,其前5个元素分别初始化为 'H','e','l','l','o',最后一个元素初始化为'\0'。

注意:如果没有'\0',那么数组str就不代表一个字符串。因为'\0'在内存中也占一个字节的存储单元,所以数组定义的长度应大于等于字符串包括'\0'在内的字符个数。字符数组str初始化后,存储结构如图:

如果省略对数组长度的声明,例如:

由于字符串字面量"Hello"的末尾字符是'例如,本例字符串的实际长度为5,而字符数组的大小为6.',因此数组的大小为字符串中实际字符的个数加1

 那么系统就会自动按照初始化列表中提供的初值个数确定数组的大小。而

补充:

系统将str初始化为一个长度为5的数组,因为存储字符串"Hello"至少需要6个字节的存储单元,长度声明为5时,将会因为没有多余空间存放编译系统在数组末尾自动添加的'\0',而使系统无法将str当作字符串处理,所以,当省略对数组长度的声明时,必须人为地在数组的初始化列表中添加'\0',才能将其作为字符串来使用。

还可以用下列俩种初始化字符数组:

char weekday[7][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
char weekday[][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

 按这种方式定义和初始化数组,不必指定数组的大小,也不必单独为数组中的每个元素进行初始化,编译系统会根据字符串中字符的个数确定数组的大小,char weekday[][] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

char* ptr = "Hello";

char* ptr; ptr = "Hello";

通常,将一个字符串存放在一维字符数组中,将多个字符串存放在二维字符数组中。当用二维字符数组存放多个字符串时,数组第一维的长度代表要存储的字符串的个数,可以省略,但第二维的长度不能省略,应按最长的字符串长度设定数组第二维的长度。例如:

注意,这里不能理解为将字符串赋值给ptr。

但是,不能写成这样:

*ptr = 'W';    /*不能修改ptr指向的常量存储区中的字符,因为它是只读的*/

因为二维数组是按行存储的,系统必须知道每一行的长度才能为数组分配存储单元。

三.字符指针

字符指针是指向字符型数据的指针变量,每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。因此,只要将字符串的首地址赋值给字符指针,即可让字符指针指向一个字符串。对于字符串字面量而言,字符串字面量本身代表的就是存放它的常量存储区的首地址,是一个地址常量。

例如:

char str[10] = "Hello";
char* ptr = str;

 与

*ptr = 'W';	//等价于ptr[0]='W';相当于str[0]='W'

是等价的,都表示定义一个字符指针变量ptr,并用字符串字面量"Hello"在常量存储区中的首地址为其初始化,即让ptr指向字符串字面量"Hello"。总之,正确使用字符指针,必须明确字符串被保存到了哪里以及字符指针指向了哪里。

因字符串"Hello"保存在只读的常量存储区中,所以此时可修改指针变量ptr的值(即ptr的指向),但不能对ptr所指向的存储单元进行写 *** 作。例如,下面 *** 作就是非法的:

四.字符串的访问和输入/输出

但可以这样 *** 作:

1.如何访问字符串中的单个字符

那么此时由于数组名代表数组的首地址,因此将str赋值给ptr,就是让ptr指向数组的str中存储的字符串"Hello"。

因数组名是一个地址常量,所以str的值是不可以修改的,但ptr的值(即ptr的指向)可以被修改,ptr所指向的字符串也可以被修改。例如,若要将ptr所指向的字符串中的第一个字符修改为'W',可以用下面语句:

(1)按c格式符,一个字符一个字符地单独输入/输出。例如:

for (i = 0; i < 10; i++) { scanf("%c", &str[i]); //输入字符数组 } for (i = 0; i < 10; i++) { printf("%c", str[i]); //输出字符数组 }

for (i = 0; str[i] != '(2).按s格式符,将字符串作为一个整体输入/输出。例如:'; i++) { printf("%c", str[i]); //输出字符串 } scanf("%s", str[i]);

和其他类型的数组一样,可以使用下标方式来访问存放于字符数组中的每个字符。例如,在前面定义的字符数组str中,str[0]就表示访问第一个字符'H',str[1]表示第二个字符'e',依次类推,可以通过下标为i的元素str[i]来访问存放于数组中的第i+1个字符。

另外,还可通过字符指针间接访问存放于数组中的字符串,例如,若字符指针ptr指向了字符数组str的首地址,则既可以通过*(ptr+i)来引用字符串中的第i+1个字符,*(ptr+i)指向相当于*(str+i),即str[i],也可以通过ptr++ *** 作,即移动指针ptr,使ptr指向值复串中的某个字符。

注意,对于数组名str,不能使用str++ *** 作使其指向字符串中的某个字符,因为数组名是一个地址常量,其值是不能改变的。 

2.字符串的输入/输出

printf("%s", str);

(3)使用字符串处理函数gets()可输入带空格的字符串

由于字符串的长度与字符数组的大小通常并不是完全一致的,因此很少使用上面这种方式输出字符数组中的字符串。更常用的方式是借助字符串结束标志'\0',识别字符串的结束,进而结束字符串的输出 *** 作,即:

puts()用于从括号内的参数给出的地址开始,依次输出存储单元中的字符,当遇到第一个'函数puts()输出字符串简洁方便,唯一不足的是不能像函数printf()那样输出行中的其他信息。'时输出结束,并且自动输出一个换行符。 

 

表示读入一个字符串,直到遇到空白字符(空格,回车符或制表符)为止,而

 

表示输出一个字符串,直到遇到字符串结束标志。这里,由于字符数组名str本身代表该数组中存放的字符串的首地址,所以数组名str的前面不能加取地址运算符。

,因为空格和制表符都是字符串的一部分

此外,函数gets()和scanf()对回车符的处理也不同。gets()以回车符作为字符串的终止符,同时将回车从输入缓冲区读走,但不作为字符串的一部分,而scanf()不读入回车符,回车符仍留在输入缓冲区中。

例如: 

#include
#define N 12
int main(void)
{
	char name[N];
	printf("Enter your name:");
	gets(name);
	printf("Hello %s!\n", name);
	return 0;
}

运行结果如下:

也可以用puts()输出字符串,[+++]

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
C语言学习笔记_C_内存溢出

C语言学习笔记

C语言学习笔记,第1张

目录

前言

一.字符串字面量

二.字符串的存储

                补充:

三.字符指针

四.字符串的访问和输入/输出

                1.如何访问字符串中的单个字符

                2.字符串的输入/输出


前言

本章内容介绍向函数传递字符串以及字符串输入/输出、复制、连接等常用的字符串处理 *** 作,主要内容有:字符串字面量,字符数组和字符指针,字符串的输入/输出、复制、连接、比较等常用的字符串处理函数,向函数传递字符串,从函数返回一个字符串指针


一.字符串字面量

字符串字面量有时也称字符串常量,它是由一对双引号括起来的一个字符序列,如"Hello","123"都是字符串。无论双引号内是否包含字符,包含多少个字符,都代表一个字符串字面量。注意:字符串字面量不同于字符串常量。例如:"a"是字符串字面量,而'a'是字符常量。 

为便于确定字符串长度,C编译器会自动在字符串的末尾添加一个ASCII码值为0的空 *** 作符'\0',作为字符串结束的标志,在字符串中可以不显示地写出。因此,字符串实际就是由若干有效字符构成且以字符'\0'作为结束的一个字符序列。

二.字符串的存储

C语言没有提供字符串数据类型,因此字符串的存取要用字符型数组来实现。一个字符串可以存在于字符数组中,但一个字符型数组中存储的并非一定是一个字符串,这要看它的最后一个元素是否为'\0',字符数组是由字符构成的数组,仅当其最后一个元素是'\0'时才能表示字符串。字符串结束标志'char str[6] = { 'H','e','l','l','o' ,'char str[] = { 'H','e','l','l','o','char str[] = { 'H','e','l','l','o' };'};'};'也占一个字节的内存,但它不计入字符串的实际长度,只计入数组的长度。

 对于字符数组,可以采用和其他数组一样的方式进行初始化。例如:

char str[] = { "Hello" };
char str[] = "Hello";

上面代码定义了一个有6个元素的字符数组str,其前5个元素分别初始化为 'H','e','l','l','o',最后一个元素初始化为'\0'。

注意:如果没有'\0',那么数组str就不代表一个字符串。因为'\0'在内存中也占一个字节的存储单元,所以数组定义的长度应大于等于字符串包括'\0'在内的字符个数。字符数组str初始化后,存储结构如图:

如果省略对数组长度的声明,例如:

由于字符串字面量"Hello"的末尾字符是'例如,本例字符串的实际长度为5,而字符数组的大小为6.',因此数组的大小为字符串中实际字符的个数加1

 那么系统就会自动按照初始化列表中提供的初值个数确定数组的大小。而

补充:

系统将str初始化为一个长度为5的数组,因为存储字符串"Hello"至少需要6个字节的存储单元,长度声明为5时,将会因为没有多余空间存放编译系统在数组末尾自动添加的'\0',而使系统无法将str当作字符串处理,所以,当省略对数组长度的声明时,必须人为地在数组的初始化列表中添加'\0',才能将其作为字符串来使用。

还可以用下列俩种初始化字符数组:

char weekday[7][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
char weekday[][10] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

 按这种方式定义和初始化数组,不必指定数组的大小,也不必单独为数组中的每个元素进行初始化,编译系统会根据字符串中字符的个数确定数组的大小,char weekday[][] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };

char* ptr = "Hello";

char* ptr; ptr = "Hello";

通常,将一个字符串存放在一维字符数组中,将多个字符串存放在二维字符数组中。当用二维字符数组存放多个字符串时,数组第一维的长度代表要存储的字符串的个数,可以省略,但第二维的长度不能省略,应按最长的字符串长度设定数组第二维的长度。例如:

注意,这里不能理解为将字符串赋值给ptr。

但是,不能写成这样:

*ptr = 'W';    /*不能修改ptr指向的常量存储区中的字符,因为它是只读的*/

因为二维数组是按行存储的,系统必须知道每一行的长度才能为数组分配存储单元。

三.字符指针

字符指针是指向字符型数据的指针变量,每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。因此,只要将字符串的首地址赋值给字符指针,即可让字符指针指向一个字符串。对于字符串字面量而言,字符串字面量本身代表的就是存放它的常量存储区的首地址,是一个地址常量。

例如:

char str[10] = "Hello";
char* ptr = str;

 与

*ptr = 'W';	//等价于ptr[0]='W';相当于str[0]='W'

是等价的,都表示定义一个字符指针变量ptr,并用字符串字面量"Hello"在常量存储区中的首地址为其初始化,即让ptr指向字符串字面量"Hello"。总之,正确使用字符指针,必须明确字符串被保存到了哪里以及字符指针指向了哪里。

因字符串"Hello"保存在只读的常量存储区中,所以此时可修改指针变量ptr的值(即ptr的指向),但不能对ptr所指向的存储单元进行写 *** 作。例如,下面 *** 作就是非法的:

四.字符串的访问和输入/输出

但可以这样 *** 作:

1.如何访问字符串中的单个字符

那么此时由于数组名代表数组的首地址,因此将str赋值给ptr,就是让ptr指向数组的str中存储的字符串"Hello"。

因数组名是一个地址常量,所以str的值是不可以修改的,但ptr的值(即ptr的指向)可以被修改,ptr所指向的字符串也可以被修改。例如,若要将ptr所指向的字符串中的第一个字符修改为'W',可以用下面语句:

(1)按c格式符,一个字符一个字符地单独输入/输出。例如:

for (i = 0; i < 10; i++) { scanf("%c", &str[i]); //输入字符数组 } for (i = 0; i < 10; i++) { printf("%c", str[i]); //输出字符数组 }

for (i = 0; str[i] != '(2).按s格式符,将字符串作为一个整体输入/输出。例如:'; i++) { printf("%c", str[i]); //输出字符串 } scanf("%s", str[i]);

和其他类型的数组一样,可以使用下标方式来访问存放于字符数组中的每个字符。例如,在前面定义的字符数组str中,str[0]就表示访问第一个字符'H',str[1]表示第二个字符'e',依次类推,可以通过下标为i的元素str[i]来访问存放于数组中的第i+1个字符。

另外,还可通过字符指针间接访问存放于数组中的字符串,例如,若字符指针ptr指向了字符数组str的首地址,则既可以通过*(ptr+i)来引用字符串中的第i+1个字符,*(ptr+i)指向相当于*(str+i),即str[i],也可以通过ptr++ *** 作,即移动指针ptr,使ptr指向值复串中的某个字符。

注意,对于数组名str,不能使用str++ *** 作使其指向字符串中的某个字符,因为数组名是一个地址常量,其值是不能改变的。 

2.字符串的输入/输出

printf("%s", str);

(3)使用字符串处理函数gets()可输入带空格的字符串

由于字符串的长度与字符数组的大小通常并不是完全一致的,因此很少使用上面这种方式输出字符数组中的字符串。更常用的方式是借助字符串结束标志'\0',识别字符串的结束,进而结束字符串的输出 *** 作,即:

puts()用于从括号内的参数给出的地址开始,依次输出存储单元中的字符,当遇到第一个'函数puts()输出字符串简洁方便,唯一不足的是不能像函数printf()那样输出行中的其他信息。'时输出结束,并且自动输出一个换行符。 

 

表示读入一个字符串,直到遇到空白字符(空格,回车符或制表符)为止,而

 

表示输出一个字符串,直到遇到字符串结束标志。这里,由于字符数组名str本身代表该数组中存放的字符串的首地址,所以数组名str的前面不能加取地址运算符。

,因为空格和制表符都是字符串的一部分

此外,函数gets()和scanf()对回车符的处理也不同。gets()以回车符作为字符串的终止符,同时将回车从输入缓冲区读走,但不作为字符串的一部分,而scanf()不读入回车符,回车符仍留在输入缓冲区中。

例如: 

#include
#define N 12
int main(void)
{
	char name[N];
	printf("Enter your name:");
	gets(name);
	printf("Hello %s!\n", name);
	return 0;
}

运行结果如下:

也可以用puts()输出字符串,

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/793581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存