2011-10-31 1 views
2

Delphi에서 AQA Computing 시험 (2011 년 6 월)을 성공적으로 완료했습니다. 호기심에서, 나는 그것을위한 표안을 읽었다. 내가 극복 할 수없는 한 가지는 C 언어 마크 스킴이 여러 측면에서 잘못되었다는 것입니다. 운 좋게 (하아!) 나는 델피에서 그것을했다. 예를 들어마크 제도 표시

,이 작은 조각 하나를 들어

char* Names[5]; 
... 
void main(void) 
{ 
    Names[1] = "Ben"; 
    Names[2] = "Thor"; 
    Names[3] = "Zoe"; 
    Names[4] = "Kate"; 
    ... 
} 

, 그것은 배열에 문자열을 할당 할 수 없습니다. strcpy와 같은 함수를 사용해야합니다. 또한 5 개의 항목이 할당 되었더라도 배열이 1에서 시작하는 이유는 무엇입니까? C를 포함한 대부분의 프로그래밍 언어는 0에서 시작합니다.

다른 문제가 있습니다. 예를 들어 문자열을 인쇄 할 때 printf("%s", "message");을 사용합니다. 좋아요. 그리고 메시지에서 이스케이프 처리되지 않은 퍼센트 기호가 나타나지 않는다고 확신 할 수 있다면 아무런 인자없이 printf 만 단독으로 나타납니다.

나는 이것을 비판하는 데 맞습니까?

참고 : 마크 스킴에 익숙하지 않은 사용자는 시험을 표시하는 데 사용됩니다. 그것이 옳은지 나는 묻는다.

+0

main()이 반환하는 제품은 무엇이라고 생각하십니까? – wildplasser

+0

@wildplasser : 아무 생각이 없습니다. 이것이 마크 제도에있는 것입니다. –

+0

마크 스킴이 무엇인지 모르겠습니다. 네 질문은 뭐니? – wildplasser

답변

3

색인을 1로 시작하는 것이 이상하고 main은 C에서 void를 반환하지 않지만 배열 할당은 유효합니다. Names은 포인터의 배열이고 "Ben"은 문자열 포인터처럼 보입니다. 문자열을 할당 된 공간에 복사하려는 경우에만 strcpy을 사용해야합니다. 컴파일러가 까다 롭지 않고 누군가가 Names[5]을 참조하지 않는 한 런타임 문제가없는 경우 해당 프로그램이 계속 컴파일됩니다.

실제로 printf가 더 좋습니다. puts은 나쁜 주주이며, 지적했듯이 이스케이프 처리되지 않은 %이 문자열에 나타나지 않는다고 확신 할 수 없습니다.

+0

배열에서 문자열을 수정하려는 시도가 발생하면 문제가 발생합니까? –

+0

@ThomasO : 네, 그렇습니다. 그 문자열은 아마도 상수의 나머지 부분과 함께 읽기 전용 메모리에 할당됩니다. (표준이 보장한다면 기억이 안납니다.) 누군가가'Names [3] [2] = 'F' '라고 말하면 나쁜 일이 일어날 수 있습니다. – nmichaels

1

하나의 경우 문자열을 배열에 할당 할 수 없습니다.

이 설명은 정확합니다. 그러나 이것은 코드에서 진행되지 않습니다. 거기에 포인터 할당이 발생합니다. 포인터의 문자열 주소를 다른 포인터에 할당 할 수 있습니다.이 포인터는 배열의 요소가됩니다. 배열을 왜

아마도 코드가 다른 언어로 번역되어 1

에서 시작 (BASIC?). 어쩌면 여기서 목표는 가능한 한 번역을 가까이서하는 것입니다. 그래서 다른 언어의 솔루션을 쉽게 비교할 수 있습니다.

0

사실이 경우 귀하의 이해가 잘못되었습니다.

Names 배열은 char 포인터의 배열로 정의됩니다. "Ben", "Thor"등은 모두 char 포인터이며 따라서 Names 배열 항목 중 하나에 정당하게 할당 될 수 있습니다.

예 첫 번째 요소는 0 색인에 있지만 코드 작성을 원하지 않을 수 있습니다. 아마도 그들은 첫 번째 요소가 어떤 값을 가질 것인지 질문 할 것입니다.이 경우에는 컴파일러에 따라 uninitilised이므로 정의되지 않은 값이됩니다.

또한 printf 문은 puts보다 안전한 명령이며 사용시 일부 유형 검사를 허용합니다.