字符串的分类
字符串字面量,有时也称为字符串常量,它是由一对双引号括起来的一个字符序列。如"Hello"、"123"等都是字符串。
下面根据字符串的数据存储类型进行分类
字符串常量
1.const char *a = "abc";
这个声明表示a是一个指向常量字符的指针,也就是说,a指向的内容是只读的,不能被修改。
解释
"abc"是一个字符串字面量(常量字符串),通常存储在只读数据区。
const char *a说明a是一个指向const char的指针,意味着不能通过a来修改"abc"串的内容
示例
#include
int main() {
const char *a = "abc";
//下面这行会导致编译错误,因为不能修改常量字符串
//a[0] = 'A'; //错误,不能修改常量字符串
printf("a:%s", a);
return 0;
}
在这个例子中,编译会报错,因为尝试修改a指向的字符串"abc",而这个字符串是只读的。
2.char *a = "abc";
这个声明表示a是一个普通的字符指针,指向一个字符串字面量(字符串常量),尽管指针a可以被修改,但实际上"abc"存储在只读的内存区域,因此通过指针a修改字符串的内容仍是非法的。
解释
"abc"是一个字符串字面量(常量字符串),通常存储在只读内存区(取决于具体的编译器或平台)。
char *a表示a是一个普通的字符指针,虽然可以修改a的指向,但不应该通过a修改它执行的字符串内容。
示例
#include
int main() {
char *a = "abc";
//下面这行会导致未定义行为,因为字符串字面量通常存储在只读内存区.
//a[0] = 'A';
printf("a: %s", a);
return 0;
}
常量字符串交换
由于常量字符串不能修改,因此不能直接交换常量字符串的内容,但是,我们可以交换指向这些字符串的指针。
示例
#include
int main() {
//常量字符串,不能直接修改其内容
const char *a = "abc";
const char *b = "bcd";
//交换指针
const char *temp = a;
a = b;
b = temp;
//输出交换之后的结果
printf("a = %s, b = %s", a, b);
//a = bcd, b = abc;
return 0;
}
字符数组
因为c语言没有提供字符串数据类型,因此字符串的存取要用字符型数组来实现。在c语言中,字符串其实就是带'\0'结束符的字符数组。
1.char str[] = "abc"
这是一个字符数组,数据的元素是可以修改的,str中存储的是"abc"的拷贝,而不是常量字符串。
解释
"abc"是一个字符串字面量,存储在程序的只读数据区,但是通过char str[]声明时,数组str会在栈上分配内存,它会将"abc"拷贝在str中。
由于str是字符数组,可以修改数组中的字符值,因此我们可以通过索引访问来修改对应下标的字符值。
示例
#include
int main() {
//创建一个字符数组,数组内容为'a','b','c','\0'
char str[] = "abc";
//可以修改字符数组中的内容
str[0] = 'A'; //修改数组中的第一个字符
printf("str = %s", str); //输出:Abc
return 0;
}
交换字符串(字符数组型)
字符数组(如char str[100])是可以修改内容的,所以如果想要交换两个字符数组的值,可以直接通过逐个字符判断的方式进行交换。通常的方法是使用逐字符交换或使用strcpy函数。
代码示例 (逐个字符交换)
#include
#include
void swap(char *a, char *b) {
int i = 0;
while (a[i] != '\0' || b[i] != '\0') {
//交换字符
char temp = a[i];
a[i] = b[i];
b[i] = temp;
i++;
}
return ;
}
int main ()
{
char str1[40] = "Hello";
char str2[40] = "World";
//交换字符串内容
swap(str1, str2);
//输出交换后的结果
printf("str1 = %s\n", str1);
printf("str2 = %s", str2);
return 0;
}
代码示例(使用strcpy交换)
strcpy的复制原理是从src字符串和dest的首地址开始,逐个的交换字符串。
也就是说,如果dest字符串中有内容,将会被覆盖。
#include
#include
void swap(char *a, char *b) {
char temp[100]; //临时储存交换的字符串
strcpy(temp, a);
strcpy(a, b);
strcpy(b, temp);
return ;
}
int main ()
{
char str1[40] = "Hello";
char str2[40] = "World";
//交换字符串内容
swap(str1, str2);
//输出交换后的字符串
printf("str1 = %s\n", str1);
printf("str2 = %s", str2);
return 0;
}
对c语言还有很多东西需要掌握,以上内容如有错误,还请指正😊