動態輸出文本中的單詞集幾種經典做法

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


第一種做法


 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




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