李成笔记网

专注域名、站长SEO知识分享与实战技巧

C语言字符串与字符数组的区别 c字符串和字符数组

字符串的处理,是计算机编程最重要的任务,没有之一。因此,字符串编程知识点的掌握,是编程学习的重要基础。

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));

}

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言