C语言计算机二级考试教程第10章(ppt文档).ppt
在C语言中,字符串是一种特殊的字符数组,它们以空字符'\0'作为结束标识。本教程主要涵盖了C语言中处理字符串的基本概念、方法以及常见函数的使用。 定义字符数组并赋值字符串的方式有多种。例如: 1. `char s[10]={'A','B','C','D','\0'};` 这种方式直接初始化数组,明确地包含结束字符`\0`。 2. `char s[10]={'A','B','C','D'};` 这种情况下,虽然没有显式指定`\0`,编译器会在末尾自动添加。 3. `char s[ ]={'A','B','C','D','\0'};` 和上面的定义类似,只是省略了数组长度。 4. `char s[10]={"ABCD"};` 和 `char s[10]="ABCD";` 这两种都是用双引号定义字符串常量,其中包含了`\0`。这两种写法等价,字符串常量在内存中会被分配足够的空间,并自动在末尾添加`\0`。 字符指针变量可以指向字符串,如`char *ps; ps = "good!";`。字符串常量("good!")在内存中是一个不可变的字符数组,其地址被赋值给指针变量ps。需要注意的是,字符串常量的修改会导致未定义行为。 C语言中,字符串本身是一个地址,即指向字符串首字符的指针。例如,`char *pc = "abcde"`,pc就是一个指向'abcde'首字符'a'的指针。`printf()`函数可以接受字符串作为参数,如`printf(p,10,20);`这里的`p`是字符串格式化字符串的地址。 字符串输入通常使用`scanf()`或`gets()`函数。`scanf()`的分隔符包括空格和回车,而`gets()`只受回车影响。例如: ```c char a[10], b[4], *p; scanf("%s%s", a, p); ``` 在这种情况下,如果输入"abcde abcd",由于p未初始化,可能会导致未定义行为。而`gets()`函数则会读取到第一个回车符前的所有字符,例如: ```c char s[10]; gets(s); ``` 如果输入"to ok",`s`将存储"to"。 字符串输出通常通过`printf()`或`puts()`完成。`printf()`按照指定格式输出,遇到`\0`结束,不自动换行;`puts()`则输出字符串后自动换行。例如: ```c char a[10] = "abcdefgh", b[10] = "1234567", *p = "ok good!"; printf("%s\n%s\n", a, b + 2); puts(p + 3); ``` 这段代码会输出: ``` abcdefgh 34567 good! ``` 接下来,我们讨论C语言中的四个常用字符串处理函数: 1. **字符串复制函数strcpy()**: `strcpy(s1, s2)` 会将`s2`指向的字符串复制到`s1`指向的空间。确保`s1`有足够的空间容纳`s2`的整个字符串。例如: ```c char a[10] = "ok", b[10], *p; strcpy(b, a); // 正确 strcpy(p, a); // 错误,p未初始化 p = b; strcpy(p, a); // 正确 ``` 2. **字符串连接函数strcat()**: `strcat(s1, s2)` 将`s2`指向的字符串连接到`s1`字符串的末尾。`s1`必须有足够的空间容纳两个字符串。例如: ```c char a[10] = "ok", b[5] = "ok", *p = "to"; strcat(a, p); // 正确 strcat(b, p); // 正确 strcat(b, "s\2\0\3\8"); // 正确 strcat(b, "abc"); // 错误,b空间不足 strcat(p, "123"); // 错误,p未指向分配的内存 ``` 3. **计算字符串长度函数strlen()**: `strlen(s)` 返回字符串`s`的长度,不包括结束字符`\0`。例如: ```c char str[] = "example"; int len = strlen(str); // len = 7 ``` 4. **比较字符串函数strcmp()**: `strcmp(s1, s2)` 比较`s1`和`s2`的大小,返回值根据两者关系决定。例如: ```c char str1[] = "hello", str2[] = "world"; int result = strcmp(str1, str2); // 如果str1 < str2,result为负数 ``` 这些基本操作构成了C语言处理字符串的基础,理解和掌握它们对于编写涉及字符串处理的C程序至关重要。在实际编程中,还需要注意防止缓冲区溢出和确保指针的安全性。
