C语言进阶教程(字符串深入)

简介: C语言进阶教程(字符串深入)

前言

其实在C语言中是没有真正的字符串的,在C语言中字符串都是使用字符数组来完成的。

一、字符数组赋值注意事项

在C语言中,字符数组(也称为字符串)只能在初始化时进行赋值。这是因为字符数组在声明时需要指定其大小,且其大小在编译时确定。由于数组的大小在编译时确定,并且是静态的,因此无法在运行时对字符数组进行动态赋值。

这意味着在声明字符数组时,必须为其分配足够的空间来存储所需的字符串。

请注意,在字符数组声明后,无法使用赋值运算符来直接更改数组内的内容。例如,以下代码是无效的:

char str[10];
str = "Hello";  // 错误,无法直接赋值给字符数组

如果需要在运行时更改字符串内容,可以使用字符指针来动态分配内存,并使用字符串相关的函数进行操作,例如 strcpy 或 strcat。

二、混淆点

下面举三个比较容易被认为是错误的操作:

1.char b = “abc”[0];

这一行代码使用了字符串字面值 “abc” 并通过索引操作符 [0] 访问其第一个字符。由于字符串在C中是以零终止的字符数组,因此可以将此操作理解为将字符数组的第一个元素赋值给变量 b。因此,b 的值将是 ‘a’。

2.char c = *(“123” + 1);

这一行代码使用字符串字面值 “123” 并通过指针偏移访问其第二个字符。首先,将字符串字面值 “123” 的地址增加 1,得到该位置的指针。然后使用解引用操作符 * 将该指针指向的值赋值给变量 c。因此,c 的值将是 ‘2’。

3.char t = *“”;

这一行代码尝试对一个空字符串 “” 进行解引用操作。然而,空字符串没有有效的内存位置可以解引用。这样的操作将导致未定义行为,并且结果不可预测。在不同的编译器和平台上,可能会产生不同的结果。因此,t 的值是不确定的。

注意:

1.字符串字面量的本质是一个数组

2.字符串字面量可以看作常量指针

3.字符串字面量中的字符不可改变

4.字符串字面量至少包含一个字符

三、字符串字面量和字符数组的区别

字符串字面量和字符数组之间有几个重要的区别:

1.可变性:字符串字面量是不可变的(immutable),而字符数组是可变的(mutable)。这意味着字符串字面量的内容无法在运行时修改,而字符数组可以通过索引进行修改。例如,可以对字符数组中的特定位置赋予新值,但不能对字符串字面量中的字符进行更改。

2.存储位置:字符串字面量通常存储在只读存储区(如常量区或只读数据段),这意味着它们的内容无法修改。而字符数组在栈或堆中分配内存,具有可读写的特性。

3.大小调整:字符串字面量的大小是在编译时决定的,它们的长度由引号内的字符确定。字符数组的大小可以在编译时或运行时决定,可以根据需求进行调整。

4.初始化:字符串字面量可以直接赋值给一个指针变量,而字符数组在声明时需要显式地指定大小,并使用字符串拷贝函数或字符赋值来进行初始化。

5.零终止字符:字符串字面量自动以零终止字符(\0)结束,可以直接用作C语言的字符串。对于字符数组,需要注意手动添加零终止字符来表示字符串的结束。

总结起来,字符串字面量是不可变且常量的,存储在只读存储区;而字符数组是可变的,存储在栈或堆上,并且可以通过索引修改其内容。字符串字面量在编译时大小确定,而字符数组在编译时或运行时大小可变。在使用字符串时,应根据需要选择适合的类型,以确保正确的行为和操作。

// 字符串字面量
char* str_literal = "Hello World";
// 字符数组
char str_array[] = "Hello World";

四、字符串长度

字符串的长度是指第一个零终止字符 (\0) 出现之前的字符个数。

int main(int argc, char** argv)
{
    char str[] = "Hello\0 World";
    printf("str len : %d\n", strlen(str));
    return 0;
}

运行结果:

总结

本篇文章就讲解到这里,下篇文章继续讲解字符串。


相关文章
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
66 10
|
2月前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
113 4
|
7月前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
3月前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
3月前
|
编译器 C语言 C++
VSCode安装配置C语言(保姆级教程)
VSCode安装配置C语言(保姆级教程)
|
3月前
|
C语言 C++
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
|
4月前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]="hello"`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
122 8
|
4月前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
265 7
|
4月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
158 4
|
4月前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。