1. 程式人生 > >C語言用一級指標處理字串的反思

C語言用一級指標處理字串的反思

1.一級指標處理字串的常見方式

如果使用單個指標,不方便對字串本身進行操作,只適合遍歷。

使用兩個指標,

兩個指標和字串大致有兩個常見處理方式:

(1)兩個指標從字串首部開始向後移動,同時處理字串。

(2)兩個指標分別指向字串首部和尾部,向中間靠攏。

2.兩個指標放在字串兩端

示例:

去除字串兩端的空格。

#include <ctype.h>
#include <string.h>
#include <stdio.h>

void trimSpace(const char *str, char *newStr, int len)
{
    
const char *p, *q; int len2; if (NULL == str || NULL == newStr) return; p = str; q = p + strlen(str) - 1; while (p < q && isspace(*p)) ++p; while (p < q && isspace(*q)) --q; len2 = q - p +1; if (len >= len2) { memcpy(newStr, p, len2); newStr[len2]
= 0; } else { memcpy(newStr, p, len); newStr[len] = 0; } } int main() { char str[] = " abcabc "; char str2[4] = {0}; trimSpace(str, str2, sizeof(str2) - 1); printf("%s\n", str2); return 0; }

(2)字串翻轉

#include <stdlib.h>
#include <string
.h> #include <stdio.h>
/* 非遞迴版本,使用指標放在字串兩端 */ void inverse(char *str) { char *p, *q, tmp; if (NULL == str) return; p = str; q = str + strlen(str) - 1; while (p < q) { tmp = *p; *p = *q; *q = tmp; ++p, --q; } } static void _inverse1(char *str1, char *str2) { if (!*str2) return; _inverse1(str1, str2+1); strncat(str1, str2, 1); } /* 遞迴版本 */ void inverse1(char *str) { char *tmp = NULL; if (NULL == str) return; if ((tmp = (char *)calloc(strlen(str) + 1, sizeof(char))) == NULL) return; _inverse1(tmp, str); strncpy(str, tmp, strlen(tmp)+1); free(tmp); } int main() { char str[] = "123456"; inverse1(str); printf("%s\n", str); return 0; }

 

3.兩個指標放在字串首部

(1)strstr挖字串

#include <string.h>
#include <stdio.h>

int getCount(const char *str1, const char *str2)
{
    const char *p1 = str1, *p2 = str2;
    int count = 0;
    
    if (NULL == str1 || NULL == str2)
        return -1;
    
    while (str1 = strstr(str1, str2)) {
        count++;
        str1 += strlen(str2);
    }

    return count;
}

int main()
{
    char str[] = "gsadgdasabcadfaabcasdabc";
    char str2[] = "abc";
    int n;

    n = getCount(str, str2);
    printf("%d\n", n);

    return 0;
}

(2)去除字串中的某些字元

去除空格。

old指標的意義是:指向舊的陣列,並挖出非空格的字元輸出給新陣列。

new指標的意義是:指向新的陣列,並輸入old指標傳來的字元。

由於 new 永遠不會超過 old 所以,新、舊陣列可以使用同樣的空間。

#include <ctype.h>
#include <string.h>
#include <stdio.h>

void trimSpace(char *str)
{
    char *new, *old;

    if (NULL == str)
        return;

    new = str;
    old = str;
    while (*old) {
        if (isspace(*old))
            ++old;
        else
            *new++ = *old++;    
    }
    *new = 0;
}

int main()
{
    char str[] = " 12  34  56  78 ";
    
    trimSpace(str);
    printf("%s\n", str);

    return 0;
}

4. 總結

如果使用一級指標處理字串,應該先思考兩個一級指標應該放在字串兩端還是一端,然後思考每個指標的實際意義。