C:一個字符數組里面解析出多個字符串
一個字符數組里面存放了多個字符串,每個字符串以 ‘\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

浙公網安備 33010602011771號