Skip to content

字符串

在 C 语言中,字符串是一组字符的序列。在 C 语言中,字符串以 null 字符 ('\0') 结尾。

初始化分配

静态分配

使用静态分配声明字符串,我们声明了一个 char 类型数组 str,该数组的长度为 10。我们还使用双引号将字符串 "Hello" 注入到数组中。

c
char str[10] = "Hello";

需要注意的是,在 C 语言中静态分配的数组大小不能动态改变,在声明时就必须指定大小。如果超出了数组大小的范围,将会发生未定义行为。

动态内存分配

使用动态内存分配函数 malloc 来为字符串分配内存方式如下:

c
char *str = (char *)malloc(6 * sizeof(char));
strcpy(str, "Hello");

在这个例子中,我们使用 malloc 函数为字符串分配了一个长度为 6 的 char 类型数组的内存。我们还使用 strcpy 函数将常量 "Hello" 复制到动态分配的内存中。

需要注意的是,一旦完成对字符串的使用,需要显式地释放分配给字符串的内存,以避免出现内存泄漏的问题。例如:

c
free(str);

这个语句将释放分配给字符串的内存。

使用字符串常量

使用字符串常量来表示字符串是一种通用的方法。例如:

c
char *str = "Hello";

在这个例子中,我们声明了一个字符指针 str。该指针指向一个字符串常量 "Hello World",这个字符串会被存储在内存中的只读数据区域,因此它在程序运行期间是一直可用的。

字符串函数

C语言提供了许多用于处理字符串的函数。以下是一些常用的字符串函数:

strlen

strlen 函数用于计算字符串的长度(不包括 null 字符)。

c
#include <string.h>

size_t strlen(const char *str);

示例

c
#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, world!";
    size_t len = strlen(str);
    printf("The length of the string is %zu.\n", len);
    return 0;
}
// The length of the string is 13.

strcpy

strcpy 函数用于将一个字符串复制到另一个字符串。

c
#include <string.h>

char *strcpy(char *dest, const char *src);

示例

c
#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, world!";
    char dest[20];
    strcpy(dest, src);
    printf("The copied string is '%s'.\n", dest);
    return 0;
}

// The copied string is 'Hello, world!'.

strncpy

strncpy 函数用于复制字符串的一部分,可限定复制的最大长度,如果源字符串长度不足,则剩余位置填充 '\0'。

c
char *strncpy(char *dest, const char *src, size_t n);

示例

c
#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, world!";
    char dest[10];
    strncpy(dest, src, sizeof(dest) - 1);
    dest[sizeof(dest) - 1] = '\0';
    printf("The copied string is '%s'.\n", dest);
    return 0;
}

// The copied string is 'Hello, wo'.

strcat

strcat 函数用于将一个字符串追加到另一个字符串的末尾。

c
#include <string.h>

char *strcat(char *dest, const char *src);

示例

c
#include <stdio.h>
#include <string.h>

int main() {
    char dest[] = "Hello, ";
    char src[] = "world!";
    strcat(dest, src);
    printf("The concatenated string is '%s'.\n", dest);
    return 0;
}

// The concatenated string is 'Hello, world!'.

strncat

strncat 函数用于连接两个字符串的一部分,依据最多连接长度连接两个字符串,如果第二个字符串长度不足,则添加 '\0'。

c
char *strncat(char *dest, const char *src, size_t n);

示例

c
#include <stdio.h>
#include <string.h>

int main() {
    char dest[20] = "Hello, ";
    char src[] = "world!";
    strncat(dest, src, 3);
    printf("The concatenated string is '%s'.\n", dest);
    return 0;
}

// The concatenated string is 'Hello, wor'.

strcmp

strcmp 函数用于比较两个字符串。

c
#include <string.h>

int strcmp(const char *str1, const char *str2);

示例

c
#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "Hello";
    char str2[] = "World";
    if (strcmp(str1, str2) < 0) {
        printf("'%s' is less than '%s'.\n", str1, str2);
    } else if (strcmp(str1, str2) > 0)
        printf("'%s' is greater than '%s'.\n", str1, str2);
    } else {
        printf("'%s' is equal to '%s'.\n", str1, str2);
    }
    return 0;
}
// 'Hello' is less than 'World'.

strncmp

strcmp 函数用于比较两个字符串的一部分是否相等,可以限定最大比较长度。

c
int strncmp(const char *str1, const char *str2, size_t n);

示例

c
#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "Hello";
    char str2[] = "Help";
    if (strncmp(str1, str2, 2) < 0) {
        printf("'%s' is less than '%s'.\n", str1, str2);
    } else if { (strncmp(str1, str2, 2) > 0)
        printf("'%s' is greater than '%s'.\n", str1, str2);
    } else {
        printf("'%s' is equal to '%s'.\n", str1, str2);
    }
    return 0;
}
// 'He' is less than 'He'.

strstr

strstr 函数用于查找一个子串在另一个字符串中的位置,如果找到则返回指向该位置的指针,否则返回 NULL。

c
char *strstr(const char *haystack, const char *needle);

示例

c
#include <stdio.h>
#include <string.h>

int main() {
    char haystack[] = "Hello, world!";
    char needle[] = "world";
    char *result = strstr(haystack, needle);
    if (result) {
        printf("The substring '%s' is found at position %ld.\n", needle, result - haystack);
    } else {
        printf("The substring '%s' is not found.\n", needle);
    }
    return 0;
}
// The substring 'world' is found at position 7.

总结

C 语言中的字符串是由字符数组组成,以空字符 '\0' 结尾。C 语言提供了大量的字符串处理函数,让我们可以方便地进行字符串的操作,如 strlen()、strcpy()、strcat()、strcmp() 等等。在使用字符串处理函数时,要注意源字符串和目标字符串的数组长度,避免越界访问导致程序崩溃。掌握字符串处理函数的使用和注意事项将有助于我们编写高效、稳定的 C 语言程序。

Released under the MIT License.