c 언어 구현 string (문자열) & 2 급 포인터 의 용법
29735 단어 데이터 구조
다음은 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.