全面理清概念,C风格字符串(多重定义方式,区别,易错点)
字符数组方式定义C风格字符串编译器会自动计算字符串长度,并为字符数组分配适当的空间(包括空字符)。这个例子中,str 是一个包含14个字符的数组,包括13个实际字符和1个空字符。指针方式定义C风格字符串str 是一个指针,它指向一个字符串常量。因此,尽管你可以更改指针指向的位置,但不能通过指针来更改字符串内容。试图修改字符串常量的内容可能导致未定义的行为。// 错误!不能修改字符串常量的内容在使用
C风格字符串
C风格字符串是一种在C语言中表示字符串的方式,它是通过字符数组来实现的。
- C风格字符串是一系列字符,以空字符(‘\0’)作为结束标志。这意味着在
声明并定义一个C风格字符串时,我们需要为数组分配比实际字符串长度多一个元素的空间,以存放空字符
。
C风格字符串的定义
C风格字符串的定义和写法:
-
字符数组方式定义C风格字符串
char str[] = "Hello, World!";
-
编译器会自动计算字符串长度,并为字符数组分配适当的空间(包括空字符)。
-
这个例子中,str 是一个包含14个字符的数组,包括13个实际字符和1个空字符。
-
或者,向下面这样定义:
char str[14] = "Hello, World!";
-
-
指针方式定义C风格字符串
char *str = "Hello, World!";
-
这种写法的注意事项:
-
str 是一个指针,它指向一个字符串常量。因此,尽管你可以更改指针指向的位置,但不能通过指针来更改字符串内容。
-
试图修改字符串常量的内容可能导致未定义的行为。
-
str[0] = 'h';
// 错误!不能修改字符串常量的内容 -
在使用这种写法时,字符串的长度不需要显式指定。编译器会自动计算字符串长度,并在末尾添加空字符。
-
与字符数组相比,这种写法使用的内存可能更少,因为字符串常量可能存储在只读内存区域,并且在程序中多次使用相同的字符串常量时,编译器可能会将它们合并为一个实例。
-
-
-
小小总结一下两种定义的区别
:- 使用字符数组形式创建的C风格字符串,可以使用
str[0] = 'h';
这样的形式,去修改字符数组中的字符。 - 使用字符指针的形式创建的C风格字符串,不可以使用
str[0] = 'h';
这样的形式,去修改字符数组中的字符,会导致未定义的行为!
- 使用字符数组形式创建的C风格字符串,可以使用
C风格字符串的易错点
- 未给字符串分配足够的空间以存放结尾的空字符,可能导致内存溢出、程序崩溃等问题。
- 在处理C风格字符串时,很容易遗漏字符串末尾的空字符,从而导致未定义的行为。
- 在字符串操作过程中,如果不小心修改了空字符,可能导致字符串操作函数无法识别字符串的终止位置。
C风格字符串与普通字符串的区别
- C风格字符串实际上是一个字符数组,其表示形式为以空字符结尾的字符序列。
- 普通字符串通常指C++中的std::string类型,它是一个类,封装了很多便捷的字符串操作函数,使用起来更加方便。
- C风格字符串在内存中是连续的字符,以空字符结尾。普通字符串不一定以空字符结尾,因为std::string会自动处理字符串长度和结尾问题。
- C风格字符串的操作需要更多的手动处理和注意事项,而std::string提供了许多内置函数来简化字符串操作。
C风格字符串用于判断大小时
- 使用strlen()函数,
返回的字符串长度不包括结尾的空字符
。这是因为strlen()函数遍历字符串时以空字符作为结束条件,因此计算的长度不包括空字符。
#include <string.h>
char str[] = "Hello, World!";
size_t len = strlen(str); // 返回13,不包括空字符
若要获取包括空字符在内的字符串大小,可以使用sizeof()函数
。sizeof()函数返回的是整个字符数组的大小,包括空字符。
char str[] = "Hello, World!";
size_t size = sizeof(str); // 返回14,包括空字符
又发现一个不容易发现的易错点。(必看)
今天在使用memcpy函数的时候发现了一个错误。
memcpy的函数原型如下:
void *memcpy(void *dest, const void *src, size_t n);
参数说明:
dest:目标内存区域的指针,即复制数据的目的地。
src:源内存区域的指针,即要复制的数据来源。
n:要复制的字节数(数据大小)。
- 我在将一个C风格字符串复制到一个共享内存段的过程中,不是要指定第三个参数嘛,第三个参数是一个数字。
- 我的C风格字符串是这样写的
char * str = "hell0, world!"
,然后我的第三个参数是这么指定的sizeof(str);
- 大家知道我错哪里了吗?
- sizeof运算符用于计算一个变量或类型所占用的字节数。
- 当你使用sizeof(str)时,你实际上计算的是指针变量str的大小,而不是指向的字符串的长度。
- 因为str是一个指针变量,所以sizeof(str)通常返回指针变量的大小(在32位系统中通常为4字节,64位系统中通常为8字节),而不是字符串的实际长度。
- 对我就错这里了,真是坑爹。
- 假如说我C风格字符串是这么写的
char str[] = "hell0, world!"
,那我就可以使用sizeof函数去计算数组的数量。 - 如果我的C风格字符串是字符指针类型的,那么我这里就只能使用
strlen(str) + 1
,来指定第三个字符的大小。
是不是觉得C风格字符串超容易错!!!!!
总结
-
在C和C++程序中,C风格字符串的表现和实现基本相同。C风格字符串在两种编程语言中都是通过字符数组实现的,以空字符(‘\0’)作为结束标志。无论是在C还是在C++中,对C风格字符串的操作和处理方式是一致的。
-
然而,需要注意的是,虽然C风格字符串在C和C++中的表示和实现相同,但C++提供了更高级的字符串类型,即std::string。std::string是一个封装了很多便捷字符串操作的类,使用起来更加方便。当在C++中编写程序时,建议使用std::string而不是C风格字符串,以便利用其提供的高级功能并避免一些潜在的风险。
-
在C++这门语言中,C风格字符串与普通字符串的最大区别是,C风格的字符串是以空字符(‘\0’)结尾的。这只是一种特别的书写习惯,并是不一种额外的数据类型。
尽管C++中支持使用C风格字符串,但是在C++程序中最好还是不要使用它们。这是因为C风格字符串不仅仅使用起来不太方便,而且极易引发程序漏洞,是诸多安全问题的根本原因!!!
最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容
。
更多推荐
所有评论(0)