source

C 구조의 문자열 필드로 작업하는 방법?

lovecheck 2023. 9. 19. 21:14
반응형

C 구조의 문자열 필드로 작업하는 방법?

링크된 목록 개념 때문이 아니라 구조체 자체의 문자열 필드 때문에 C에서 단일 링크된 목록을 기반으로 데이터베이스를 만드는 데 어려움을 겪고 있습니다.

이것은 C의 과제이고 제가 알기로는 (저는 초보자입니다) C는 'string'을 데이터 타입으로 인식하지 않습니다.

내 구조 코드는 다음과 같습니다.

typedef struct 
{
  int number;
  string name;
  string address;
  string birthdate;
  char gender;
} patient;

typedef struct llist
{
  patient num;
  struct llist *next;
} list;

저는 이 구조물에 사용할 수 있도록 줄 자체에 대한 구조물건에 사용할 수 있도록 말이죠.

typedef struct string 
{ 
  char *text;
} *string;

그럼 제가.malloc()문자열 유형(char 배열)의 새 데이터를 만들어야 할 때 각각의 데이터를 저장합니다.

typedef struct string
{
  char *text;
} *string;

int main()
{
    int length = 50;
    string s = (string) malloc(sizeof string);
    s->text = (char *) malloc(len * sizeof char);
    strcpy(s->text, patient.name->text);
}

누가 좀 도와주실 수 있나요?
감사해요.

문자열 및 메모리 할당 시:

C의 문자열은 단지 다음의 순서일 뿐입니다.chars, 사용할 수 있도록char *아니면.char문자열 데이터 유형을 사용할 수 있는 배열:

typedef struct     {
  int number;
  char *name;
  char *address;
  char *birthdate;
  char gender;
} patient;

그런 다음 구조 자체와 문자열 각각에 대해 메모리를 할당해야 합니다.

patient *createPatient(int number, char *name, 
  char *addr, char *bd, char sex) {

  // Allocate memory for the pointers themselves and other elements
  // in the struct.
  patient *p = malloc(sizeof(struct patient));

  p->number = number; // Scalars (int, char, etc) can simply be copied

  // Must allocate memory for contents of pointers.  Here, strdup()
  // creates a new copy of name.  Another option:
  // p->name = malloc(strlen(name)+1);
  // strcpy(p->name, name);
  p->name = strdup(name);
  p->address = strdup(addr);
  p->birthdate = strdup(bd);
  p->gender = sex;
  return p;
}

몇 개만 필요하시면patients, 필요한 것보다 더 많은 메모리를 할당하는 비용으로 메모리 관리를 피할 수 있습니다.

typedef struct     {
  int number;
  char name[50];       // Declaring an array will allocate the specified
  char address[200];   // amount of memory when the struct is created,
  char birthdate[50];  // but pre-determines the max length and may
  char gender;         // allocate more than you need.
} patient;

링크된 목록에서:

일반적으로 링크된 목록의 목적은 순서대로 배열된 요소 모음에 빠르게 액세스할 수 있음을 증명하는 것입니다.당신의llist다음과 같은 요소를 포함합니다.num(아마도 환자 번호가 포함되어 있을 것입니다), 실제 데이터를 보관하려면 추가 데이터 구조가 필요합니다.patient환자 번호를 매번 찾아봐야 할 겁니다

대신에, 만일 당신이 선언한다면,

typedef struct llist
{
  patient *p;
  struct llist *next;
} list;

각 요소는 a에 대한 직접적인 포인터를 포함합니다.patient구조, 그리고 당신은 다음과 같이 데이터에 접근할 수 있습니다.

patient *getPatient(list *patients, int num) {
  list *l = patients;
  while (l != NULL) {
    if (l->p->num == num) {
      return l->p;
    }
    l = l->next;
  }
  return NULL;
}

이 솔루션은 코드 사용이 적고 초보자도 이해하기 쉽다고 생각합니다.

문자열 필드 구조의 경우 포인터를 사용할 수 있으며 해당 포인터에 문자열을 다시 할당하는 것이 더 쉽고 간단합니다.

구조물의 정의:

typedef struct {
  int number;
  char *name;
  char *address;
  char *birthdate;
  char gender;
} Patient;

해당 구조의 유형으로 변수 초기화:

Patient patient;
patient.number = 12345;
patient.address = "123/123 some road Rd.";
patient.birthdate = "2020/12/12";
patient.gender = 'M';

그렇게 간단합니다.이 답변이 많은 개발자들에게 도움이 되길 바랍니다.

만약 당신이 타이프 디프를 사용하고 싶다면 리처드의 것이 당신이 원하는 것이지만, 당신이 아무것도 얻지 못하면서 포인터가 되는 것을 보지 못하기 때문에, 나는 이것이 아마도 특별히 좋은 생각은 아니라고 제안합니다.

카운트된 문자열이나 추가 기능이 있는 문자열을 처리하는 경우에는 다를 수 있지만 이 경우 '표준' C 문자열 구현이 'char *'인 것에 익숙해질 것을 권장합니다.

더 간단한 를 할 수 있습니다.typedef:

typedef char *string;

그렇다면, 당신의 malloc은 보통의 malloc처럼 보일 것입니다.

string s = malloc(maxStringLength);

작동하지 않습니다.

string s = (string)malloc(sizeof string); 

string포인터를 가리킵니다. 구조 자체의 크기가 필요합니다.

string s = malloc(sizeof (*string)); 

하다는 점도 하십시오(에서)에서 변환).void*(malloc의 반환 유형)을 은연중에 수행합니다.

에,main으로 으로인 를가 합니다.patient, 하지만 그건 초기화되지 않았습니다.도:

 patient.number = 3;     
 patient.name = "John";     
 patient.address = "Baker street";     
 patient.birthdate = "4/15/2012";     
 patient.gender = 'M';     

그 회원들 중 누구라도 다시 접속하기 전에

또한 경계 검사가 없기 때문에 본질적으로 안전하지 않습니다(첫번째까지 복사됨).'\0'소스가 너무 길면 할당된 메모리를 지난 상태로 기록합니다.strncpy대신, 복사된 최대 문자 수를 지정할 수 있습니다. 문서를 읽어 정확한 값을 전달하는지 확인하면 오류가 하나씩 발생하기 쉽습니다.

언급URL : https://stackoverflow.com/questions/10162152/how-to-work-with-string-fields-in-a-c-struct

반응형