字符串的处理,是计算机编程最重要的任务,没有之一。因此,字符串编程知识点的掌握,是编程学习的重要基础。
C++中有一个标准容器std::string,相当于是C++的字符串数据类型。而C语言中,基础变量类型有int , char , float ,double, bool 等,但是并没有字符串这个类型,C语言的字符串还有没有必要学习呢?先说答案是:很有必要! 因为C语言字符串的知识点,在C++编程中、可执行文件的命令行参数等,是无法绕过去的坎,必须要掌握!有鉴于此,重新拾起C语言字符串知识点,温习一下,顺便分享出来。
一、C语言字符串的定义
区别于C++的字符串,C语言的字符串又称为“C风格字符串”,即c_string,它有两个特点:
1、都有一条尾巴:'\0', 即ASCII字符Null。
2、用字符串数组存储。
示例代码:
void AboutString()
{
printf("What is C style string?\n");
printf("\t C string is stored in char array, ended up with \\0. \n ");
char ch[10] = {'H','e','l','l','o','\0'};
printf("\t Your string is \"%s\"\n", ch);
printf("\t The array that stored the string \"%s\" occupies %d bytes in memory.\n", ch,sizeof(ch)); //从数组名获取数组占用内存大小
printf("\t There %d characters in string \"%s\".\n", strlen(ch),ch);
}
程序输出:
What is C style string?
C string is stored in char array, ended up with \0.
Your string is "Hello"
The array that stored the string "Hello" occupies 10 bytes in memory.
There 5 characters in string "Hello".
二、C语言字符串的存储
C语言字符串存储在字符数组中,数组的大小最少要比字符串中字符数大1,否则会报错,这个多出来的一个字节,用来存储ASCII字符Null, 即 '\0'.
在前面的例子中,建立了一个10字节大小的字符串数组,存储了字符串“Hello”,后面紧跟一个'\0', 一共存储了6个字符在数组中。
三、C语言字符串的输入输出
有两类库函数可以使用,一是格式化的输入输出库函数scanf() / printf(), 一是 gets() / puts() 库函数。
看代码范例,如何从键盘输入姓名。英文的姓名一般包括两部分 firstName + lastName, firstName是名字,lastName是姓氏,如Microsoft公司创始人 Bill Gates。
输入字符串,在C语言中有2个坑需要避免。
(1)第1个坑是输入字符串遇到“断章取义”。采用scanf()输入字符串时,遇到空格就会停止读取,后面的字符就会被丢弃。
(2)第2坑是输入字符串时遇到“木马屠城”。scanf()语句遇到空格就完活了,后面的字符会被下一条输入语句当成它的输入而读取并且返回,接收不到正确的输入。
void GetName()
{
char name[30];
printf("Input your name: ");
scanf("%s",name); //read a c_string until Blank or Enter, leave Enter or Blank in buffer
printf("\n Hello %s\n",name);
while(getchar() != '\n') { }; //flush the input buffer by reading and discarding
printf("Input your name again: ");
gets(name); //read c_string, including blank inside
printf("Hello %s , your name has %d characters.",name,strlen(name));
}
程序的输出:
Input your name: Bill Gates
Hello Bill
Input your name again: Bill Gates
Hello Bill Gates , your name has 10 characters.
代码中的 while(getchar() != '\n') { }语句,其作用就相当于flush, 清除缓冲区,让后续的gets()语句可以重新接收来自键盘的输入。
四、C语言字符串与字符数组的区别
字符串只是字符串,而字符数组是字符数组,二者并不是一回事,虽然就像鱼儿离不开水,但是鱼儿不是水,水也不是鱼儿。
字符串在数组的存储,一定会添加一个'\0',字符串只占据字符数组一部分的空间,而且是从头开始的连续存储空间。
每一个字符串,都需要一个字符数组来存储,但字符数组存储的字符可以不是字符串。字符数组占用的存储空间大小,以及字符串中的字符个数,可以用库函数sizeof(arrayName)/sizeof(arrayName[0])和strlen()算出来,这在第一部分的代码中就给出示例。
【结束语】
本文温习了C语言的字符串相关知识点,并且给出了相关代码配合讲解。'\0'让C拥有了“字符串”数据类型。
后续继续分享C语言字符串有关知识点,且看代码:
void stringPointer()
{
char charArr1[10] = "12345";
char charArr2[10] ="12345\n";
printf("string1: %s, strlen(Arr1) = %d, string2: %s, strlen(Arr2) = %d",charArr1,strlen(charArr1),charArr2,strlen(charArr2));
}