一个字符数组里面存放了多个字符串,每个字符串以 ‘\0’。要求把这些有效字符串筛选出来并输出。
扩展:'\0\0' 表示字符串结束。V2 方法就是实现的这个扩展功能。
#include <stdio.h> #include <string.h> #include <malloc.h> void printSzNameList(char szNameList[], int length){ printf("\r\n-------------- start printStringList------------------\r\n"); char temp[256] = {0}; // 假设每个字符串都不会超过127个字符(留一个位置给'\0') const char *start = szNameList; // 指向当前正在处理的字符串的起始位置 // 遍历整个数组直到遇到结尾或超出长度 while (start < szNameList + length) { // 找到当前字符串的结尾('\0') const char *end = strchr(start, '\0'); // 检查是否找到了结尾且没有超出数组范围 if (end == NULL || (size_t)(end - szNameList) >= length) { // 如果没有找到结尾或超出了数组范围,则停止 break; } // 使用memcpy将字符串复制到临时变量中(包括结尾的'\0') // 注意:这里我们不需要+1来包含'\0',因为strchr已经返回了指向'\0'的指针 // 但为了安全起见,我们仍然使用end - start来计算长度(实际上这包括了'\0') memcpy(temp, start, end - start); // 输出字符串 int charLen = strlen(temp); if(charLen>0){ printf("%s\n", temp); } // 将临时变量清零(实际上这一步是多余的,因为temp在每次循环开始时都会被重新使用) // 但为了符合您的要求,我们还是执行它 memset(temp, 0, sizeof(temp)); // 更新start指针到下一个字符串的开始位置 start = end + 1; } printf("\r\n------------- end printStringList------------------\r\n"); } void printSzNameListV2(char* ptr){ printf("\r\n-------------- start printStringListV2------------------\r\n"); while(ptr && ptr[0]) { printf("%s\n", ptr); ptr += (strlen(ptr) + 1); } printf("\r\n------------- end printStringListV2------------------\r\n"); } void test1(){ printf("========== test1 ============= "); char szNameList1[128] = "a11\0a22\0a33\0abcde\0\0\0\0abcdef\0\0"; //char szNameList2[128] = "a11\0a22\0a33\0abcde\0\0\0\0abcdef\0\0"; printSzNameList(szNameList1, sizeof(szNameList1)); printSzNameListV2(szNameList1); } void test2(){ printf("========== test2 ============= "); char szNameList1[128] = "a11\0a22\0a33\0abcde\0\0\0\0abcdef\0\0ghijklmn"; //char szNameList2[128] = "a11\0a22\0a33\0abcde\0\0\0\0abcdef\0\0"; printSzNameList(szNameList1, sizeof(szNameList1)); printSzNameListV2(szNameList1); } void main(){ printf("hello c 20240816\n"); test1(); test2(); } // gcc c_demo1.c -std=c11 -o demo1
标签:字符,end,char,start,szNameList1,printf,字符串,解析 From: https://www.cnblogs.com/music-liang/p/18362966