c 언어 구현 string (문자열) & 2 급 포인터 의 용법

29735 단어 데이터 구조
  • 인 터 페 이 스 는 엄 울 민 선생님 의 데이터 구조 교과서
  • 를 참고 한다.
  • 이런 bug de 는 오 랜 시간 동안 2 급 지침 의 사용 (C 언어학 적 으로 지침 을 사용 하기 어 려 운 것 은 정말 상처)
  • 에 있 습 니 다.
  • 실현 환경 은 Liux
  • 이다.
    다음은 2 급 지침 에 관 한 지식 을 말씀 드 리 겠 습 니 다.
    void change(char** x)
    {
        *x = "bbb";
    }
     
    int main(void)
    {
        char *y = "aaa";
        change(&y);
       printf("%s",y);    
       return 0;
    }
    

    이 함 수 를 보십시오. 출력 은 bbb 입 니 다.이것 은 정확 한 결과 이다.
    다음 함수 보기:
    void change(char* x)
    {
        *x = "bbb";
    }
     
    int main(void)
    {
        char *y = "aaa";
        change(y);
       printf("%s",y);    
       return 0;
    }
    

    이 함수 의 출력 은 aaa 입 니 다. 결 과 는 우리 가 원 하 는 것 이 아 닙 니 다.
    사실 이것 은 쉽게 이해 할 수 있 습 니 다. 우 리 는 char * 를 string 이 라 고 생각하면 2 급 지침 은 string *, 즉 문자열 을 가리 키 는 1 급 지침 이 됩 니 다.
    다음은 String 의 실현 을 살 펴 보 겠 습 니 다.
    String.h
    #ifndef STRING_H_
    #define STRING_H_
    #include 
    
    #define ERROR 0
    #define OK 1
    #define OVERFLOW -1
    
    typedef struct {
    	char *ch;
    	int length;
    } String;
    
    /*generate a string whose value is equal to chars*/
    bool StrAssign(String *S, char **chars);
    
    /*return the length of the string*/
    unsigned int Length(String S);
    
    /*compare S1 and S2 and if S1 > S2 return 1 else return 0*/
    bool Compare(String S1, String S2);
    
    /*empty the string*/
    void ClearString(String *S);
    
    /*concat S1 and S2 and return the value using T*/
    bool Concat(String *S, String S1, String S2);
    
    /*return a substring of S whose length is len from the position of pos*/
    String SubString(String S, int pos, int len);
    
    /*print the string*/
    void Traverse(String S);
    #endif
    

    String.c
    #include 
    #include "String.h"
    #include 
    #include 
    bool StrAssign(String *S, char **chars) {
    /*	if(S->ch) {
    		S->length = 0;
    		free(S->ch);
    		S->ch = NULL;
    	}*/
    	int i;
    	char *c;
    	//i = strlen(*chars);
    	for(i = 0, c = *chars; *c; i++, c++);
    	//	printf("%d
    ",i);
    if (!i) { S->ch = NULL; S->length = 0; } else { S->ch = (char*)malloc(i * sizeof(char)); for(int j = 0; j < i; j++) { S->ch[j] = (*chars)[j]; } S->length = i; } return OK; } unsigned int Length(String S) { return S.length; } /*compare S1 and S2 and if S1 > S2 return 1 else return 0*/ bool Compare(String S1, String S2) { int i, j; for (i = 0, j = 0; i < S1.length || i < S2.length; i++, j++) { if (S1.ch[i] > S2.ch[j]) { return 1; } else if (S1.ch[i] < S2.ch[j]) { return 0; } else { continue; } } if(S1.length > S2.length) return 1; else return 0; } /*empty the string*/ void ClearString(String *S) { S->length = 0; free(S->ch); S->ch = NULL; } /*concat S1 and S2 and return the value using T*/ bool Concat(String *S, String S1, String S2) { S->ch = (char*)malloc((S1.length + S2.length) * sizeof(char)); S->length = S1.length + S2.length; for (int i = 0; i < S1.length; i++) { S->ch[i] = S1.ch[i]; } for (int i = 0; i < S2.length; i++) { S->ch[i + S1.length] = S2.ch[i]; } return OK; } /*return a substring of S whose length is len from the position of pos*/ String SubString(String S, int pos, int len) { String T; T.length = len; T.ch = (char*)malloc(len*sizeof(char)); for (int i = pos - 1; i < pos - 1 + len; i++) { T.ch[i - pos + 1] = S.ch[i]; } return T; } void Traverse(String S) { if (S.ch == NULL) printf("null"); else { for (int i = 0; i < S.length; i++) { printf("%c", S.ch[i]); } } printf("
    "
    ); }

    main.c
    #include 
    #include "String.h"
    int main () {
    	String S, S1, S2;
    	char *m = "ef";
    	StrAssign(&S1,&m);
    	//printf("%d
    ",S1.length);
    char *a = "abced"; StrAssign(&S, &a); Traverse(S); //printf("%d
    ",S.length);
    //printf("%p
    ",m);
    //printf("%p
    ",a);
    Traverse(S1); Concat(&S2, S, S1); Traverse(S2); String s = SubString(S2, 2, 3); Traverse(s); if (Compare(S1, S2)) printf("S1 > S2
    "
    ); else printf("S1 <= S2
    "
    ); ClearString(&S); ClearString(&s); ClearString(&S1); ClearString(&S2); Traverse(S); }

    makefile
    object = main.o String.o
    
    test : $(object)
    	gcc -g -Wall -o test $(object)
    
    main.o : String.h
    String.o : String.h
    
    .PHONY : clean
    
    clean:
    	rm -rf *.o
    

    좋은 웹페이지 즐겨찾기