计算机存储和处理所有种类的数据。
字符串只是信息呈现和被计算机处理的众多形式之一。
C语言中的字符串与其他现代编程语言的工作方式不同。
在这篇文章中,你将学习如何在C语言中声明字符串。
在这之前,你要先了解一下C语言中的数据类型、变量和数组的基本情况。这样,你就会明白在C语言中处理字符串时,这些数据是如何相互联系的。
了解这些概念的基础知识将有助于你更好地理解如何在C语言中声明和处理字符串。
让我们开始吧!
C语言中的数据类型
C语言有一些内置的数据类型:
它们是int,short,long,float,double,long double 和char 。
如你所见,没有内置的字符串或str(字符串的缩写)数据类型。
C语言中的char 数据类型
从你刚才看到的那些类型来看,在C语言中使用和呈现字符的唯一方法是使用char 数据类型。
使用char ,你能够表示一个单一的字符--在你的计算机所识别的256个字符中。它最常被用来表示ASCII表中的字符。
单个字符被单引号所包围。
下面的例子都是chars - 即使是由单引号和单空格包围的数字,在C语言中也是char :
'D', '!', '5', 'l', ' '
每一个由单引号包围的字母、符号、数字和空格在C语言中都是一个单一的字符数据。
如果你想呈现一个以上的单一字符怎么办?
下面的内容不是一个有效的char --尽管被单引号所包围。这是因为它在单引号内并没有只包括一个字符:
'freeCodeCamp is awesome'
当许多单字符被串成一组时,就像你在上面看到的句子,就会产生一个字符串。在这种情况下,当你使用字符串时,你应该只使用双引号,而不是单引号:
"freeCodeCamp is awesome"
如何在C语言中声明变量
到目前为止,你已经看到了C语言中文本的呈现方式。
但是,如果你想把文本存储在某个地方,会发生什么?毕竟,计算机非常善于将信息保存在内存中,以便以后检索和使用。
在C语言和大多数编程语言中,你存储数据的方式是变量。
从本质上讲,你可以把变量看作是容纳一个值的盒子,这个值可以在程序的整个生命周期中发生变化。变量在计算机的内存中分配空间,让C知道你想保留一些空间。
C语言是一种静态类型的语言,意味着当你创建一个变量时,你必须指定该变量的数据类型。
在C语言中有许多不同的变量类型,因为有许多不同种类的数据。
每个变量都有一个相关的数据类型。
当你创建一个变量时,你首先要提到该变量的类型(它是否将保存整数、浮点、char或任何其他数据值),它的名字,然后可以选择给它赋值:
#include <stdio.h>
int main(void){
char letter = 'D';
//creates a variable named letter
//it holds only values of type char
// the single character 'D' is assigned to letter
}
在C语言中处理变量时要注意不要混合数据类型,因为这将导致错误。
例如,如果你试图改变上面的例子,使用双引号(记住,字符只使用单引号),当你编译代码时,你会得到一个错误:
#include <stdio.h>
int main(void){
char letter = "D";
//output:
test.c:4:6: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type
'char [2]' [-Wint-conversion]
char letter = "D";
^ ~~~
1 warning generated.
}
正如前面提到的,C语言没有一个内置的字符串数据类型。这也意味着C语言没有字符串变量!
如何在C语言中创建数组
数组本质上是一个存储多个值的变量。它是许多相同类型的项目的集合。
与普通变量一样,数组也有许多不同的类型,因为数组只能保存相同数据类型的项目。有一些数组只保存int,只保存float,等等。
例如,这就是你如何定义一个intss的数组:
int numbers[3];
首先,你要指定数组要容纳的项目的数据类型。然后你给它起一个名字,在名字后面还紧紧包括一对方括号,里面是一个整数。这个整数代表了数组的长度。
在上面的例子中,该数组可以容纳3 值。
在定义了数组后,你可以用方括号符号,用索引的方式来单独分配数值。C语言(以及大多数编程语言)中的索引是从0 :
//Define the array; it can hold 3 values
int numbers[3];
//assign the 1st item of the numbers array the value of 1
int numbers[0] = 1;
//assign the 2nd item of the numbers array the value of 2
int numbers[1] = 2;
//assing the 3rd item of the numbers array the value of 3
int numbers[2] = 3;
你通过使用数组的名称和方括号中的项目索引来引用和获取数组中的一个项目,就像这样:
numbers[2]; // returns the value 3
什么是C语言中的字符数组?
那么,到目前为止所提到的一切是如何结合在一起的,它与在C语言中初始化字符串和将其保存在内存中有什么关系?
好吧,C语言中的字符串实际上是一种数组类型--具体来说,它们是一个character array 。字符串是一个char 值的集合。
字符串如何在C语言中工作
在C语言中,所有的字符串都以一个0 。这个0 让C语言知道一个字符串在哪里结束。
这个字符串结束的零被称为字符串结束符。你可能也会看到术语null zero用于此,它具有相同的含义。
不要把这个终结零与数字整数0 ,甚至是字符'0' 相混淆,它们不是一回事。
在C语言中,字符串结束符被自动添加到每个字符串的末尾,但我们看不到它--它只是一直存在。
字符串终止符是这样表示的:'\0' 。它与字符'0' 的不同之处在于它的反斜杠。
在C语言中处理字符串时,想象一下它们总是以空0结尾并在结尾处有一个额外的字节是很有帮助的。
每个字符在内存中占用一个字节。
上图中的字符串"hello" ,就占用了6 bytes 。
"Hello "有五个字母,每个字母占用一个字节的空间,然后空零也占用一个字节。
C语言中字符串的长度
C语言中字符串的长度只是一个字的字符数,不包括字符串终止符(尽管它总是被用来终止字符串)。
当你想找到一个字符串的长度时,字符串终止符就不会被计算在内。
例如,字符串freeCodeCamp ,其长度为12 个字符。
但是在计算一个字符串的长度时,你必须同时计算任何空白。
例如,字符串I code 的长度为6 。I 是1个字符,code 有4个字符,然后还有1个空白。
因此,一个字符串的长度与它的字节数和它所占用的内存空间数量不是同一个数字。
如何在C语言中创建字符数组并初始化字符串
第一步是使用char 数据类型。这让C知道你想创建一个存放字符的数组。
然后你给数组起个名字,紧接着你要包括一对开头和结尾的方括号。
在方括号内,你将包含一个整数。这个整数将是你希望你的字符串 包括字符串结束符在内的最大字符数:
char city[7];
你可以像这样一次一个字符地初始化一个字符串:
#include <stdio.h>
int main(void) {
char city[7];
city[0] = 'A';
city[1] = 't';
city[2] = 'h';
city[3] = 'e';
city[4] = 'n';
city[5] = 's';
city[6] = '\0'; //don't forget this!
printf("I live in %s",city);
}
但这是相当耗时的。相反,当你第一次定义字符数组时,你可以选择使用双引号中的字符串字面直接给它赋值:
#include <stdio.h>
int main(void){
char city[7] = "Athens";
//defines a character array named city
//it can hold a string up to 7 characters INCLUDING the string terminator
//the value "Athens" is assigned when the character array is being defined
//this is how you print the character array value
printf("I live in %s",city);
}
如果你想,不把数字放在方括号里,你可以只给字符数组赋值。
它的工作原理与上面的例子完全一样。它将计算你提供的值中的字符数,并在最后自动添加空零字符:
char city[] = "Athens";
//"Athens" has a length of 6 characters
//"Athens" takes up 7 bytes in memory,with the null zero included
/*
char city[7] = "Athens";
is equal to
char city[] = "Athens";
*/
记住,你总是需要为你想包括的最长的字符串加上字符串结束符预留足够的空间。
如果你想要更多的空间,需要更多的内存,并计划以后改变数值,请在方括号中包括一个更大的数字:
char city[15] = "Athens";
/*
The city character array will now be able to hold 15 characters
(including the null zero)
In this case, the remaining 8 (15 - 7) places will be empty
You'll be able to reassign a value up to 15 characters (including null zero as always)
*/
如何改变一个字符数组的内容
那么,你知道如何在C语言中初始化字符串,但如果你想改变这个字符串呢?
你不能简单地使用赋值运算符(=),给它赋一个新的值。你只有在第一次定义字符数组时才能这样做。
正如前面所看到的,从一个数组中访问一个项目的方法是通过引用数组的名称和项目的索引号。
所以要改变一个字符串,你可以一个一个地单独改变每个字符:
#include <stdio.h>
int main(void) {
char city[7] = "Athens";
printf("I live in %s",city);
//changing each character individually means you have to use single quotation marks
//the new value has to take up 7 bytes of memory
//indexing starts at 0, the first character has an index of 0
city[0] = 'L';
city[1] = 'o';
city[2] = 'n';
city[3] = 'd';
city[4] = 'o';
city[5] = 'n';
city[6] = '\0'; //DON'T FORGET THIS!
printf("\nBut now I live in %s",city);
}
//output:
//I live in Athens
//But now I live in London
不过,这种方法相当麻烦,费时,而且容易出错。它绝对不是首选的方法。
你可以改用strcpy() 函数,它代表string copy 。
要使用这个功能,你必须在文件顶部的#include <stdio.h> 行之后加入#include <string.h> 行。
<string.h> 文件提供了strcpy() 功能。
当使用strcpy() ,你首先包括字符阵列的名称,然后是你想分配的新值。strcpy() 函数会自动在创建的新字符串上添加字符串终止符:
#include <stdio.h>
#include <string.h>
int main(void) {
char city[15] = "Athens";
strcpy(city,"Barcelona");
printf("I am going on holiday to %s",city);
//output:
//I am going on holiday to Barcelona
}
结论
这就是你的收获。现在你知道如何在C语言中声明字符串了。
总结一下:
- C语言没有一个内置的字符串函数。
- 要处理字符串,你必须使用字符数组。
- 在创建字符数组时,要为你要存储的最长的字符串留出足够的空间,并考虑到C语言中每个字符串的结尾都有字符串终止符。
- 要在字符数组中放置或改变字符串,你要么:
- 定义数组,然后一次分配每个单独的字符元素。
- 或者在定义数组的同时初始化一个值。
- 当改变字符串的值时,你可以在包含
<string.h>头文件后使用strcpy()函数。
如果你想了解更多关于C语言的知识,我已经为初学者写了一份指南,让他们在这门语言中迈出第一步。
它是基于CS50的计算机科学导论课程的前几周,我解释了一些基本概念,并从高层次上介绍了该语言的工作原理。
你也可以在freeCodeCamp的YouTube频道上观看《C语言编程初学者教程》。
谢谢你的阅读,学习愉快 :)