動態分配內存輸出文本中的單詞的四種做法

題目:有一段文本,將文本中的所有單詞,存放到一個字符指針數組中(要求每個單詞內存恰好)。


  • 第一種做法



  •  char c[] = "     asd afil     kjgl    rip  kjgdr  gds  sdg  gs ";

  •     char b[10] = {0};

  •     char *a[10] = {NULL};

  •     int i = 0, j = 0,k = 0;     //i使字符不斷後移,j用來標識指針a,k用來標識中間字符數組b;

  •     

  •     while (1) {//把字符串的'\0' 作爲if判斷的條件,避免遇到\0不在判斷

  •         if (c[i] != ' ' && c[i] != '\0') {

  •             b[k++] = c[i++];

  •             continue//提高效率,當進行此if判斷時,就不在進行一下if判斷

  •         }

  •         if ((c[i] == ' ' || c[i] == '\0') && k != 0) {

  • //k判斷是否有字符賦給b數組,沒有的話意味着前面是空空格,就不在需要進行判斷,提高運行效率

  •             b[k] = '\0';                 //給數組b加上\0 ,結束字符

  •             a[j] = malloc(strlen(b) + 1); //爲指針開闢空間

  •             strcpy(a[j], b);          //b是首地址,a[j]也是首地址,函數具有複製功能,如:%s

  •             k = 0;

  •             j++;

  •         }

  •         if (c[i] == '\0') {           //把while中的\0判斷移到可以先判斷\0的情況

  •             break;

  •         }

  •         i++;

  •     }

  •     for (int i = 0 ; i  < j ; i++ ) {

  •         printf("%s\n", a[i]);        //int a = 10; int *b = null;   b = &a; *b = 10;

  •         free(a[i]);                  //* 具有指向功能,

  •         a[i] = NULL;

  •     }


  • 第二種做法



  •     char str[] = "        a41 a1421     b3511 b b    c c c c       dddddd      jkthku";

  •     //2.如何存儲一個單詞?

  •     char tempStr[20] = {0}; //存儲文本中的一個單詞

  •     //3.如何存儲堆區空間的地址?

  •     char *p[255] = {0};

  •     //4.如何查找單詞,並且將對應的單詞存放到臨時數組中?

  •     int i = 0//標識str字符串中字符的下標

  •     int j = 0//標識tempStr字符串中字符的下標

  •     int k = 0//標識指針數組中元素的下標.

  •     while (1) {

  •         if (str[i] != ' ' && str[i] != '\0') {

  •             //當獲取到的元素不爲空格時,將它存儲到臨時數組tempStr中.

  •             tempStr[j++] = str[i];

  •         } else if (j != 0) {

  •             //當遇到空格,或者遇到\0時.單詞的存放結束

  •             tempStr[j] = '\0'//最後一個元素補上\0

  •             //動態計算所需堆區空間的大小,將地址存放到對應的字符指針數組元素中

  •             p[k] = malloc(strlen(tempStr) + 1);

  •             //將臨時數組tempStr中字符串拷貝到對應堆區空間上.

  •             strcpy(p[k], tempStr);

  •             k++;

  •             j = 0//存儲下一單詞時,又從數組的第一個字符開始.

  •         }

  •         //當讀取到\0時,字符串讀取完畢,跳出循環

  •         if (str[i] == '\0') {

  •             break;

  •         }

  •         i++;  //移動到str數組中的下一個元素

  •     }

  •     for (int i = 0; i < k; i++) {

  •         printf("%s ", p[i]);

  •         free(p[i]);

  •         p[i] = NULL;

  •     }

  • 第三種做法


  •     char str[50] ="  qwo   shi shui nishi   hhdj";

  •     char temp[20] = {0};

  •     char *p[10] = {0};

  •     int count = 0;

  •     int d = 0,i = 0,index = 0,h = 0;

  •     while (str[i] != '\0') {

  •         if (str[i] != ' ') {

  •             count ++;

  •             i ++;

  •             index = i - count;

  •             }

  •         if (str[i] == ' ' || str[i] == '\0'  ){

  •             

  •             if (count != 0) {

  •                 int k = 0;

  •                 for (int j = index; j < i;j ++) {

  •                     temp[k] = str[j];

  •                     k ++;

  •                     d = k;

  •                 }

  •                 temp[k] = '\0';

  •                 printf("%s\n",temp);

  •                 p[h] = malloc(count + 1);

  •                 strcpy(p[h], temp);

  •                 h ++;

  •                 count = 0;

  •                 }

  •             i ++;

  •             }

  •         }

  •     for (int i = 0; i < h; i ++) {

  •         printf("%s ",p[i]);

  •         free(p[i]);

  •         p[i] = NULL;

  •     }

  • 第四種做法


  • char a[] = "  The end of   the World Cup does not mean the end of international competition in Brazil this year";

  • char *p[100] = {0};  //記錄單詞

  • char temp[100] = {0};  //臨時記錄單詞

  • int i = 0;    //記錄a[]數組元素的位置

  • int j = 0;    //記錄單詞的個數

  • int k = 0;    //記錄temp[]數組中臨時單詞的字母個數(元素位置)

  • int count = 0;

  • while (a[i] != '\0') {

  •     if ((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z')) {

  •         count++;

  •         temp[k] = a[i];

  •         k++;

  •     } else if (k != 0) {

  •         temp[k] = '\0';

  •         k = 0;

  •         p[j] = malloc(sizeof(char) * count + 1);

  •         strcpy(p[j], temp);

  •         printf("%s ", p[j]);

  •         free(p[j]);

  •         p[j] = NULL;

  •         j++;

  •         count = 0;

  •     }

  •     if (a[i + 1] == '\0' && a[i] != ' ') {

  •         temp[k] = '\0';

  •         k = 0;

  •         p[j] = malloc(sizeof(char) * count + 1);

  •         strcpy(p[j], temp);

  •         printf("%s ", p[j]);

  •         free(p[j]);

  •         p[j] = NULL;

  •     }

  •     i++;

  • }


over



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章