서투른 법학 C 연습 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
$
너 는 이 프로그램 에서 매우 재 미 있 는 일이 있다 는 것 을 알 게 될 것 이다.
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 에 대해 상기 상 반 된 조작 을 수행 하고 printf 을 names 배열 로 생각 하 며 한 번 에 하나의 names 를 인쇄 한다. int 는 무엇 을 제시 할 까?int 를 사용 할 수 있 습 니까?당신 은 어떻게 흑 마술 로 그것 을 실현 합 니까?Valgrind 형식 으로 전환 했다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.