C语言字符串/字符数组声明最佳实践及相关技术问题咨询
C语言字符串与字符数组常见问题解答
1. Code#1中两种字符数组声明的规范用法
两种声明的核心区别是是否自动添加字符串终止符\0:
char message1[] = "abc";:这是C语言中声明字符串的标准写法,编译器会自动在末尾追加\0,可直接使用strlen()、printf("%s")等字符串处理函数,代码简洁且符合字符串操作规范,优先推荐用于需要当作字符串处理的场景。char message2[] = {'a','b','c'};:这种方式仅初始化字符数组,不会添加\0,本质是普通的字符集合,不能直接用字符串函数(否则会因越界访问内存导致未定义行为)。仅适合不需要当作字符串的场景,比如处理固定长度的非字符串字符数据、二进制字节流等。
2. C语言的socket函数recv()会自动添加终止空字符吗?
不会。recv()是面向字节流的函数,仅负责从socket接收指定字节数的数据,不会对数据做任何额外处理(包括添加\0)。如果需要将接收的字节当作C字符串使用,必须手动在缓冲区的有效数据末尾添加\0,且要确保缓冲区预留了足够的空间(比如缓冲区大小要比最大接收字节数多1),否则使用字符串函数时会出现越界访问问题。
3. Code#2中如何判断message4是否与message3部分匹配?
由于message3和message4都是没有\0的纯字符数组,不能直接用strstr()这类字符串匹配函数,需要手动实现匹配逻辑:
场景1:判断message4是否是message3的前缀
通过逐字符比较实现:
#include <stdio.h> // arr1: 目标数组, len1: 目标数组长度; arr2: 待匹配数组, len2: 待匹配数组长度 int is_prefix(const char *arr1, size_t len1, const char *arr2, size_t len2) { if (len2 > len1) return 0; // 待匹配数组更长,直接不匹配 for (size_t i = 0; i < len2; i++) { if (arr1[i] != arr2[i]) { return 0; } } return 1; } int main() { char message3[] = {'a','b','c','e','f'}; char message4[] = {'a','b'}; size_t len3 = sizeof(message3) / sizeof(message3[0]); size_t len4 = sizeof(message4) / sizeof(message4[0]); if (is_prefix(message3, len3, message4, len4)) { printf("message4是message3的前缀\n"); } else { printf("不匹配\n"); } return 0; }
场景2:判断message4是否在message3的任意位置匹配
遍历message3的每个可能起始位置,逐个与message4比较:
#include <stdio.h> int is_subarray(const char *arr1, size_t len1, const char *arr2, size_t len2) { if (len2 > len1) return 0; // 遍历所有可能的起始位置 for (size_t i = 0; i <= len1 - len2; i++) { int match = 1; for (size_t j = 0; j < len2; j++) { if (arr1[i + j] != arr2[j]) { match = 0; break; } } if (match) return 1; } return 0; } int main() { char message3[] = {'a','b','c','e','f'}; char message4[] = {'a','b'}; size_t len3 = sizeof(message3) / sizeof(message3[0]); size_t len4 = sizeof(message4) / sizeof(message4[0]); if (is_subarray(message3, len3, message4, len4)) { printf("message4与message3部分匹配\n"); } else { printf("不匹配\n"); } return 0; }
内容的提问来源于stack exchange,提问作者kazekage
相关产品推荐
相关产品推荐

