서투른 법학 C 연습 9: 배열 과 문자열

연습 9: 배열 과 문자열
본문: 연습 9: 배열 과 문자열
비 룡
지난 연습 에서 우 리 는 기본 적 인 배열 을 만 드 는 방법 과 배열 을 문자열 로 매 핑 하 는 방법 을 배 웠 다.이 연습 에서 우 리 는 배열 과 문자열 의 유사 점 을 더욱 전면적으로 보 여주 고 더 많은 메모리 레이아웃 에 대한 지식 을 깊이 있 게 할 것 이다.
이 연습 은 C 가 문자열 을 문자 배열 로 간단하게 저장 하고 끝 에 '\0' (빈 문자) 를 추가 하 는 것 을 보 여 준다.너 는 아마도 지난 연습 에서 암 시 를 받 았 을 것 이다. 왜냐하면 우 리 는 수 동 으로 이렇게 했 기 때문이다.다음 에 나 는 그것 을 디지털 배열 과 비교 하여 다른 방법 으로 더욱 분명하게 실현 할 것 이다.
#include 

int main(int argc, char *argv[])
{
    int numbers[4] = {0};
    char name[4] = {'a'};

    // first, print them out raw
    printf("numbers: %d %d %d %d
", numbers[0], numbers[1], numbers[2], numbers[3]); printf("name each: %c %c %c %c
", name[0], name[1], name[2], name[3]); printf("name: %s
", name); // setup the numbers numbers[0] = 1; numbers[1] = 2; numbers[2] = 3; numbers[3] = 4; // setup the name name[0] = 'Z'; name[1] = 'e'; name[2] = 'd'; name[3] = '\0'; // then print them out initialized printf("numbers: %d %d %d %d
", numbers[0], numbers[1], numbers[2], numbers[3]); printf("name each: %c %c %c %c
", name[0], name[1], name[2], name[3]); // print the name like a string printf("name: %s
", name); // another way to use name char *another = "Zed"; printf("another: %s
", another); printf("another each: %c %c %c %c
", another[0], another[1], another[2], another[3]); return 0; }

이 코드 에서 우 리 는 배열 을 만 들 고 배열 요소 에 값 을 부여 합 니 다.numbers 에서 우 리 는 숫자 를 설 정 했 지만 names 에서 우 리 는 실제로 수 동 으로 문자열 을 만 들 었 다.
뭐 공부 해요?
이 코드 를 실행 할 때 인쇄 된 배열 의 내용 이 0 값 으로 초기 화 되 는 것 을 먼저 보고 초기 화 된 내용 을 인쇄 해 야 합 니 다.
$ make ex9
cc -Wall -g    ex9.c   -o ex9
$ ./ex9
numbers: 0 0 0 0
name each: a   
name: a
numbers: 1 2 3 4
name each: Z e d 
name: Zed
another: Zed
another each: Z e d
$

너 는 이 프로그램 에서 매우 재 미 있 는 일이 있다 는 것 을 알 게 될 것 이다.
  • 나 는 그것 을 초기 화하 기 위해 모든 4 개의 인 자 를 제공 하지 않 았 다.이것 은 C 의 약자 입 니 다. 만약 에 하나의 요소 만 제공 하면 나머지 는 0 입 니 다.
  • numbers 의 모든 요소 가 인쇄 될 때 0 을 출력 합 니 다.
  • names 의 모든 요소 가 인쇄 되 었 을 때 첫 번 째 요소 'a' 만 표시 되 었 습 니 다. 'a' 는 특수 문자 이기 때문에 표시 되 지 않 습 니 다.
  • 그리고 우 리 는 처음으로 인쇄 names 를 했 습 니 다. "a" 표현 식 의 'a' 문 자 를 초기 화 한 후에 '\0' 로 채 웠 습 니 다. '\0' 로 끝 나 는 정확 한 문자열 이기 때 문 입 니 다.
  • 우 리 는 이 어 모든 요소 에 수 동 으로 값 을 부여 하 는 방법 으로 배열 을 만 들 고 다시 인쇄 합 니 다.그들 에 게 무슨 변화 가 생 겼 는 지 보 자.현재 numbers 문자열 이 어떻게 내 이름 을 정확하게 인쇄 하 는 지 설정 되 어 있 습 니 다.
  • 문자열 을 만 드 는 데 도 두 가지 문법 이 있 습 니 다. 여섯 번 째 줄 names 이나 44 번 째 줄 char name[4] = {'a'} 입 니 다.전 자 는 그다지 자주 사용 되 지 않 으 니, 후 자 를 문자열 의 액면가 에 사용 해 야 한다.

  • 같은 문법 과 코드 스타일 을 사용 하여 정수 배열 과 문자 배열 과 상호작용 을 했 지만 char *another = "name"printf 문자열 이 라 고 생각 합 니 다.C 언어 에 문자 배열 과 문자열 이 다 르 지 않 기 때 문 이 라 고 재차 강조 했다.
    마지막 으로 문자열 의 액면 가 를 사용 할 때 name 문법 을 사용 해 야 합 니 다. 똑 같은 것 이 생 길 수 있 지만 언어 습관 에 더욱 부합 되 고 편리 합 니 다.
    어떻게 그것 을 붕괴 시 킵 니까?
    C 의 모든 bug 의 대부분 소스 는 충분 한 공간 을 미리 남 겨 두 는 것 을 잊 거나 문자열 끝 에 하 나 를 추가 하 는 것 을 잊 었 습 니 다 char *another = "Literal".사실 이러한 bug 는 매우 보편적 이 고 고치 기 어 려 운 것 으로 대부분의 우수한 C 코드 는 C 스타일 문자열 을 사용 하지 않 습 니 다.다음 연습 에서 우 리 는 C 스타일 문자열 을 철저히 피 하 는 방법 을 배 울 것 이다.
    이 프로그램 을 붕괴 시 키 는 관건 은 문자열 의 끝 을 없 애 는 것 이다 '\0'.다음은 그것 을 실현 하 는 몇 가지 경로 이다.
  • 삭제 '\0' 의 초기 화 표현 식.
  • 일부러 설정 하지 않 았 기 때문에 종료 문자 가 없습니다.
  • 초기 화 표현 식 을 name 으로 설정 하여 너무 많은 name[3] = 'A' 문자 가 있어 서 'a','a','a','a'} 위 치 를 남 길 수 없습니다.

  • 다른 방법 을 생각해 내 서 그것 을 붕괴 시 키 고 'a' 에서 이 프로그램 을 똑 같이 실행 하려 고 한다. 구체 적 으로 무슨 일이 일 어 났 는 지, 그리고 잘못된 이름 이 무엇 인지 볼 수 있다.때때로 '\0' 당신 이 저 지 른 실 수 를 발견 하지 못 할 경우, 이 변수 들 을 이동 해서 실 수 를 찾 을 수 있 는 지 확인 해 야 한다.이것 은 C 의 흑 마술 의 일부분 으로 변수의 위치 가 bug 를 바 꿀 때 도 있다.
    부가 문제
  • 일부 문 자 를 Valgrind 요소 에 부여 한 다음 Valgrind 한 번 에 문 자 를 인쇄 하면 어떤 컴 파일 러 경 고 를 받 을 수 있 습 니까?
  • numbers 에 대해 상기 상 반 된 조작 을 수행 하고 printfnames 배열 로 생각 하 며 한 번 에 하나의 names 를 인쇄 한다. int 는 무엇 을 제시 할 까?
  • 인쇄 할 수 있 는 다른 방법 은 몇 가지 가 있 습 니까?
  • 만약 에 한 문자 배열 이 네 개의 바이트 를 차지 하고 한 개의 정수 도 4 개의 바이트 를 차지한다 면 정수 처럼 전체 int 를 사용 할 수 있 습 니까?당신 은 어떻게 흑 마술 로 그것 을 실현 합 니까?
  • 종이 한 장 을 꺼 내 각 배열 을 네모 난 상자 로 그린 다음 종이 에 코드 의 조작 을 그 려 정확 한 지 확인 하 세 요.
  • 코드 가 정상적으로 작 동 하 는 지 Valgrind 형식 으로 전환 했다.
  • 좋은 웹페이지 즐겨찾기